root / trunk / Libraries / Json40r2 / Source / Src / Newtonsoft.Json.Tests / Converters / CustomCreationConverterTests.cs @ d78cbf09
History | View | Annotate | Download (6 kB)
1 |
using System; |
---|---|
2 |
using System.Collections.Generic; |
3 |
using System.Linq; |
4 |
using System.Text; |
5 |
using Newtonsoft.Json.Converters; |
6 |
using NUnit.Framework; |
7 |
|
8 |
namespace Newtonsoft.Json.Tests.Converters |
9 |
{ |
10 |
public class CustomCreationConverterTests : TestFixtureBase |
11 |
{ |
12 |
public interface IPerson |
13 |
{ |
14 |
string FirstName { get; set; } |
15 |
string LastName { get; set; } |
16 |
DateTime BirthDate { get; set; } |
17 |
} |
18 |
|
19 |
public class Employee : IPerson |
20 |
{ |
21 |
public string FirstName { get; set; } |
22 |
public string LastName { get; set; } |
23 |
public DateTime BirthDate { get; set; } |
24 |
|
25 |
public string Department { get; set; } |
26 |
public string JobTitle { get; set; } |
27 |
} |
28 |
|
29 |
public class PersonConverter : CustomCreationConverter<IPerson> |
30 |
{ |
31 |
public override IPerson Create(Type objectType) |
32 |
{ |
33 |
return new Employee(); |
34 |
} |
35 |
} |
36 |
|
37 |
public void DeserializeObject() |
38 |
{ |
39 |
string json = JsonConvert.SerializeObject(new List<Employee> |
40 |
{ |
41 |
new Employee |
42 |
{ |
43 |
BirthDate = new DateTime(1977, 12, 30, 1, 1, 1, DateTimeKind.Utc), |
44 |
FirstName = "Maurice", |
45 |
LastName = "Moss", |
46 |
Department = "IT", |
47 |
JobTitle = "Support" |
48 |
}, |
49 |
new Employee |
50 |
{ |
51 |
BirthDate = new DateTime(1978, 3, 15, 1, 1, 1, DateTimeKind.Utc), |
52 |
FirstName = "Jen", |
53 |
LastName = "Barber", |
54 |
Department = "IT", |
55 |
JobTitle = "Manager" |
56 |
} |
57 |
}, Formatting.Indented); |
58 |
|
59 |
//[ |
60 |
// { |
61 |
// "FirstName": "Maurice", |
62 |
// "LastName": "Moss", |
63 |
// "BirthDate": "\/Date(252291661000)\/", |
64 |
// "Department": "IT", |
65 |
// "JobTitle": "Support" |
66 |
// }, |
67 |
// { |
68 |
// "FirstName": "Jen", |
69 |
// "LastName": "Barber", |
70 |
// "BirthDate": "\/Date(258771661000)\/", |
71 |
// "Department": "IT", |
72 |
// "JobTitle": "Manager" |
73 |
// } |
74 |
//] |
75 |
|
76 |
List<IPerson> people = JsonConvert.DeserializeObject<List<IPerson>>(json, new PersonConverter()); |
77 |
|
78 |
IPerson person = people[0]; |
79 |
|
80 |
Console.WriteLine(person.GetType()); |
81 |
// Newtonsoft.Json.Tests.Employee |
82 |
|
83 |
Console.WriteLine(person.FirstName); |
84 |
// Maurice |
85 |
|
86 |
Employee employee = (Employee)person; |
87 |
|
88 |
Console.WriteLine(employee.JobTitle); |
89 |
// Support |
90 |
} |
91 |
|
92 |
public class MyClass |
93 |
{ |
94 |
public string Value { get; set; } |
95 |
|
96 |
[JsonConverter(typeof(MyThingConverter))] |
97 |
public IThing Thing { get; set; } |
98 |
} |
99 |
|
100 |
public interface IThing |
101 |
{ |
102 |
int Number { get; } |
103 |
} |
104 |
|
105 |
public class MyThing : IThing |
106 |
{ |
107 |
public int Number { get; set; } |
108 |
} |
109 |
|
110 |
public class MyThingConverter : CustomCreationConverter<IThing> |
111 |
{ |
112 |
public override IThing Create(Type objectType) |
113 |
{ |
114 |
return new MyThing(); |
115 |
} |
116 |
} |
117 |
|
118 |
[Test] |
119 |
public void AssertDoesDeserialize() |
120 |
{ |
121 |
const string json = @"{ |
122 |
""Value"": ""A value"", |
123 |
""Thing"": { |
124 |
""Number"": 123 |
125 |
} |
126 |
} |
127 |
"; |
128 |
MyClass myClass = JsonConvert.DeserializeObject<MyClass>(json); |
129 |
Assert.IsNotNull(myClass); |
130 |
Assert.AreEqual("A value", myClass.Value); |
131 |
Assert.IsNotNull(myClass.Thing); |
132 |
Assert.AreEqual(123, myClass.Thing.Number); |
133 |
} |
134 |
|
135 |
[Test] |
136 |
public void AssertShouldSerializeTest() |
137 |
{ |
138 |
MyClass myClass = new MyClass |
139 |
{ |
140 |
Value = "Foo", |
141 |
Thing = new MyThing { Number = 456, } |
142 |
}; |
143 |
string json = JsonConvert.SerializeObject(myClass); // <-- Exception here |
144 |
|
145 |
const string expected = @"{""Value"":""Foo"",""Thing"":{""Number"":456}}"; |
146 |
Assert.AreEqual(expected, json); |
147 |
} |
148 |
|
149 |
internal interface IRange<T> |
150 |
{ |
151 |
T First { get; } |
152 |
T Last { get; } |
153 |
} |
154 |
|
155 |
internal class Range<T> : IRange<T> |
156 |
{ |
157 |
public T First { get; set; } |
158 |
public T Last { get; set; } |
159 |
} |
160 |
|
161 |
internal class NullInterfaceTestClass |
162 |
{ |
163 |
public virtual Guid Id { get; set; } |
164 |
public virtual int? Year { get; set; } |
165 |
public virtual string Company { get; set; } |
166 |
public virtual IRange<decimal> DecimalRange { get; set; } |
167 |
public virtual IRange<int> IntRange { get; set; } |
168 |
public virtual IRange<decimal> NullDecimalRange { get; set; } |
169 |
} |
170 |
|
171 |
internal class DecimalRangeConverter : CustomCreationConverter<IRange<decimal>> |
172 |
{ |
173 |
public override IRange<decimal> Create(Type objectType) |
174 |
{ |
175 |
return new Range<decimal>(); |
176 |
} |
177 |
} |
178 |
|
179 |
internal class IntRangeConverter : CustomCreationConverter<IRange<int>> |
180 |
{ |
181 |
public override IRange<int> Create(Type objectType) |
182 |
{ |
183 |
return new Range<int>(); |
184 |
} |
185 |
} |
186 |
|
187 |
[Test] |
188 |
public void DeserializeAndConvertNullValue() |
189 |
{ |
190 |
NullInterfaceTestClass initial = new NullInterfaceTestClass |
191 |
{ |
192 |
Company = "Company!", |
193 |
DecimalRange = new Range<decimal> { First = 0, Last = 1 }, |
194 |
Id = new Guid(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), |
195 |
IntRange = new Range<int> { First = int.MinValue, Last = int.MaxValue }, |
196 |
Year = 2010, |
197 |
NullDecimalRange = null |
198 |
}; |
199 |
|
200 |
string json = JsonConvert.SerializeObject(initial, Formatting.Indented); |
201 |
|
202 |
Assert.AreEqual(@"{ |
203 |
""Id"": ""00000001-0002-0003-0405-060708090a0b"", |
204 |
""Year"": 2010, |
205 |
""Company"": ""Company!"", |
206 |
""DecimalRange"": { |
207 |
""First"": 0.0, |
208 |
""Last"": 1.0 |
209 |
}, |
210 |
""IntRange"": { |
211 |
""First"": -2147483648, |
212 |
""Last"": 2147483647 |
213 |
}, |
214 |
""NullDecimalRange"": null |
215 |
}", json); |
216 |
|
217 |
NullInterfaceTestClass deserialized = JsonConvert.DeserializeObject<NullInterfaceTestClass>( |
218 |
json, new IntRangeConverter(), new DecimalRangeConverter()); |
219 |
|
220 |
Assert.AreEqual("Company!", deserialized.Company); |
221 |
Assert.AreEqual(new Guid(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), deserialized.Id); |
222 |
Assert.AreEqual(0, deserialized.DecimalRange.First); |
223 |
Assert.AreEqual(1, deserialized.DecimalRange.Last); |
224 |
Assert.AreEqual(int.MinValue, deserialized.IntRange.First); |
225 |
Assert.AreEqual(int.MaxValue, deserialized.IntRange.Last); |
226 |
Assert.AreEqual(null, deserialized.NullDecimalRange); |
227 |
Assert.AreEqual(2010, deserialized.Year); |
228 |
} |
229 |
} |
230 |
} |