2
// Copyright (c) 2007 James Newton-King
4
// Permission is hereby granted, free of charge, to any person
5
// obtaining a copy of this software and associated documentation
6
// files (the "Software"), to deal in the Software without
7
// restriction, including without limitation the rights to use,
8
// copy, modify, merge, publish, distribute, sublicense, and/or sell
9
// copies of the Software, and to permit persons to whom the
10
// Software is furnished to do so, subject to the following
13
// The above copyright notice and this permission notice shall be
14
// included in all copies or substantial portions of the Software.
16
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
// OTHER DEALINGS IN THE SOFTWARE.
27
using System.ComponentModel;
29
using System.Runtime.Serialization;
30
#if !(SILVERLIGHT || PocketPC || NET20 || NET35 || NETFX_CORE || PORTABLE)
31
using System.Runtime.Serialization.Json;
34
using Newtonsoft.Json.Tests.TestObjects;
36
using NUnit.Framework;
38
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
39
using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute;
40
using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute;
42
using Newtonsoft.Json.Utilities;
44
namespace Newtonsoft.Json.Tests.Serialization
47
public class DefaultValueHandlingTests : TestFixtureBase
52
Invoice invoice = new Invoice
54
Company = "Acme Ltd.",
58
FollowUpEmailAddress = string.Empty,
62
string included = JsonConvert.SerializeObject(invoice,
64
new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Include });
67
""Company"": ""Acme Ltd."",
72
""FollowUpEmailAddress"": """"
77
public void SerializeInvoice()
79
Invoice invoice = new Invoice
81
Company = "Acme Ltd.",
85
FollowUpEmailAddress = string.Empty,
89
string included = JsonConvert.SerializeObject(invoice,
91
new JsonSerializerSettings { });
94
""Company"": ""Acme Ltd."",
99
""FollowUpEmailAddress"": """"
102
string ignored = JsonConvert.SerializeObject(invoice,
104
new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
107
""Company"": ""Acme Ltd."",
113
public void SerializeDefaultValueAttributeTest()
115
string json = JsonConvert.SerializeObject(new DefaultValueAttributeTestClass(),
116
Formatting.None, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
117
Assert.AreEqual(@"{""TestField1"":0,""TestProperty1"":null}", json);
119
json = JsonConvert.SerializeObject(new DefaultValueAttributeTestClass { TestField1 = int.MinValue, TestProperty1 = "NotDefault" },
120
Formatting.None, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
121
Assert.AreEqual(@"{""TestField1"":-2147483648,""TestProperty1"":""NotDefault""}", json);
123
json = JsonConvert.SerializeObject(new DefaultValueAttributeTestClass { TestField1 = 21, TestProperty1 = "NotDefault" },
124
Formatting.None, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
125
Assert.AreEqual(@"{""TestProperty1"":""NotDefault""}", json);
127
json = JsonConvert.SerializeObject(new DefaultValueAttributeTestClass { TestField1 = 21, TestProperty1 = "TestProperty1Value" },
128
Formatting.None, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });
129
Assert.AreEqual(@"{}", json);
133
public void DeserializeDefaultValueAttributeTest()
137
DefaultValueAttributeTestClass c = JsonConvert.DeserializeObject<DefaultValueAttributeTestClass>(json, new JsonSerializerSettings
139
DefaultValueHandling = DefaultValueHandling.Populate
141
Assert.AreEqual("TestProperty1Value", c.TestProperty1);
143
c = JsonConvert.DeserializeObject<DefaultValueAttributeTestClass>(json, new JsonSerializerSettings
145
DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate
147
Assert.AreEqual("TestProperty1Value", c.TestProperty1);
151
public class NetworkUser
153
[JsonProperty(PropertyName = "userId")]
155
public long GlobalId { get; set; }
157
[JsonProperty(PropertyName = "age")]
159
public int Age { get; set; }
161
[JsonProperty(PropertyName = "amount")]
163
public decimal Amount { get; set; }
165
[JsonProperty(PropertyName = "floatUserId")]
166
[DefaultValue(-1.0d)]
167
public float FloatGlobalId { get; set; }
169
[JsonProperty(PropertyName = "firstName")]
170
public string Firstname { get; set; }
171
[JsonProperty(PropertyName = "lastName")]
172
public string Lastname { get; set; }
177
FloatGlobalId = -1.0f;
184
public void IgnoreNumberTypeDifferencesWithDefaultValue()
186
NetworkUser user = new NetworkUser
191
string json = JsonConvert.SerializeObject(user, Formatting.None, new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore });
193
Assert.AreEqual(@"{""firstName"":""blub""}", json);
197
public void ApproxEquals()
199
Assert.IsTrue(MathUtils.ApproxEquals(0.0, 0.0));
200
Assert.IsTrue(MathUtils.ApproxEquals(1000.0, 1000.0000000000001));
202
Assert.IsFalse(MathUtils.ApproxEquals(1000.0, 1000.000000000001));
203
Assert.IsFalse(MathUtils.ApproxEquals(0.0, 0.00001));
208
public void EmitDefaultValueTest()
210
EmitDefaultValueClass c = new EmitDefaultValueClass();
212
#if !(SILVERLIGHT || PocketPC || NET20 || NET35 || NETFX_CORE || PORTABLE)
213
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(EmitDefaultValueClass));
215
MemoryStream ms = new MemoryStream();
216
jsonSerializer.WriteObject(ms, c);
218
Assert.AreEqual("{}", Encoding.UTF8.GetString(ms.ToArray()));
221
string json = JsonConvert.SerializeObject(c);
223
Assert.AreEqual("{}", json);
228
public void DefaultValueHandlingPropertyTest()
230
DefaultValueHandlingPropertyClass c = new DefaultValueHandlingPropertyClass();
232
string json = JsonConvert.SerializeObject(c, Formatting.Indented);
239
json = JsonConvert.SerializeObject(c, Formatting.Indented, new JsonSerializerSettings
241
DefaultValueHandling = DefaultValueHandling.Ignore
248
json = JsonConvert.SerializeObject(c, Formatting.Indented, new JsonSerializerSettings
250
DefaultValueHandling = DefaultValueHandling.Include
260
public void DeserializeWithIgnore()
262
string json = @"{'Value':null,'IntValue1':1,'IntValue2':0,'IntValue3':null}";
264
var o = JsonConvert.DeserializeObject<DefaultValueHandlingDeserializeHolder>(json, new JsonSerializerSettings
266
DefaultValueHandling = DefaultValueHandling.Ignore
269
Assert.AreEqual(int.MaxValue, o.IntValue1);
270
Assert.AreEqual(int.MinValue, o.IntValue2);
271
Assert.AreEqual(int.MaxValue, o.IntValue3);
272
Assert.AreEqual("Derp!", o.ClassValue.Derp);
276
public void DeserializeWithPopulate()
280
var o = JsonConvert.DeserializeObject<DefaultValueHandlingDeserializePopulate>(json, new JsonSerializerSettings
282
DefaultValueHandling = DefaultValueHandling.Populate
285
Assert.AreEqual(1, o.IntValue1);
286
Assert.AreEqual(0, o.IntValue2);
287
Assert.AreEqual(null, o.ClassValue);
291
public class DefaultValueHandlingDeserialize
293
public string Derp { get; set; }
296
public class DefaultValueHandlingDeserializeHolder
298
public DefaultValueHandlingDeserializeHolder()
300
ClassValue = new DefaultValueHandlingDeserialize
304
IntValue1 = int.MaxValue;
305
IntValue2 = int.MinValue;
306
IntValue3 = int.MaxValue;
310
public int IntValue1 { get; set; }
311
public int IntValue2 { get; set; }
313
public int IntValue3 { get; set; }
314
public DefaultValueHandlingDeserialize ClassValue { get; set; }
317
public class DefaultValueHandlingDeserializePopulate
319
public DefaultValueHandlingDeserializePopulate()
321
ClassValue = new DefaultValueHandlingDeserialize
325
IntValue1 = int.MaxValue;
326
IntValue2 = int.MinValue;
330
public int IntValue1 { get; set; }
331
public int IntValue2 { get; set; }
332
public DefaultValueHandlingDeserialize ClassValue { get; set; }
335
public struct DefaultStruct
337
public string Default { get; set; }
340
public class DefaultValueHandlingPropertyClass
342
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
343
public int IntIgnore { get; set; }
345
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)]
346
public int IntInclude { get; set; }
349
public int IntDefault { get; set; }
354
public class EmitDefaultValueClass
356
[DataMember(EmitDefaultValue = false)]
357
public Guid Guid { get; set; }
358
[DataMember(EmitDefaultValue = false)]
359
public TimeSpan TimeSpan { get; set; }
360
[DataMember(EmitDefaultValue = false)]
361
public DateTime DateTime { get; set; }
362
[DataMember(EmitDefaultValue = false)]
363
public DateTimeOffset DateTimeOffset { get; set; }
364
[DataMember(EmitDefaultValue = false)]
365
public decimal Decimal { get; set; }
366
[DataMember(EmitDefaultValue = false)]
367
public int Integer { get; set; }
368
[DataMember(EmitDefaultValue = false)]
369
public double Double { get; set; }
370
[DataMember(EmitDefaultValue = false)]
371
public bool Boolean { get; set; }
372
[DataMember(EmitDefaultValue = false)]
373
public DefaultStruct Struct { get; set; }
374
[DataMember(EmitDefaultValue = false)]
375
public StringComparison Enum { get; set; }
377
[DataMember(EmitDefaultValue = false)]
378
public Guid? NullableGuid { get; set; }
379
[DataMember(EmitDefaultValue = false)]
380
public TimeSpan? NullableTimeSpan { get; set; }
381
[DataMember(EmitDefaultValue = false)]
382
public DateTime? NullableDateTime { get; set; }
383
[DataMember(EmitDefaultValue = false)]
384
public DateTimeOffset? NullableDateTimeOffset { get; set; }
385
[DataMember(EmitDefaultValue = false)]
386
public decimal? NullableDecimal { get; set; }
387
[DataMember(EmitDefaultValue = false)]
388
public int? NullableInteger { get; set; }
389
[DataMember(EmitDefaultValue = false)]
390
public double? NullableDouble { get; set; }
391
[DataMember(EmitDefaultValue = false)]
392
public bool? NullableBoolean { get; set; }
393
[DataMember(EmitDefaultValue = false)]
394
public DefaultStruct? NullableStruct { get; set; }
395
[DataMember(EmitDefaultValue = false)]
396
public StringComparison? NullableEnum { get; set; }
398
[DataMember(EmitDefaultValue = false)]
399
public object Object { get; set; }
b'\\ No newline at end of file'