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.Collections.Generic;
30
using NUnit.Framework;
32
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
33
using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute;
34
using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute;
36
using Newtonsoft.Json;
38
using Newtonsoft.Json.Linq;
39
using Newtonsoft.Json.Tests.Serialization;
40
using Newtonsoft.Json.Tests.TestObjects;
42
namespace Newtonsoft.Json.Tests.Linq
45
public class JTokenReaderTest : TestFixtureBase
47
#if !PocketPC && !NET20
49
public void YahooFinance()
53
new JProperty("Test1", new DateTime(2000, 10, 15, 5, 5, 5, DateTimeKind.Utc)),
54
new JProperty("Test2", new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0))),
55
new JProperty("Test3", "Test3Value"),
56
new JProperty("Test4", null)
59
using (JTokenReader jsonReader = new JTokenReader(o))
61
IJsonLineInfo lineInfo = jsonReader;
64
Assert.AreEqual(JsonToken.StartObject, jsonReader.TokenType);
65
Assert.AreEqual(false, lineInfo.HasLineInfo());
68
Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
69
Assert.AreEqual("Test1", jsonReader.Value);
70
Assert.AreEqual(false, lineInfo.HasLineInfo());
73
Assert.AreEqual(JsonToken.Date, jsonReader.TokenType);
74
Assert.AreEqual(new DateTime(2000, 10, 15, 5, 5, 5, DateTimeKind.Utc), jsonReader.Value);
75
Assert.AreEqual(false, lineInfo.HasLineInfo());
76
Assert.AreEqual(0, lineInfo.LinePosition);
77
Assert.AreEqual(0, lineInfo.LineNumber);
80
Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
81
Assert.AreEqual("Test2", jsonReader.Value);
84
Assert.AreEqual(JsonToken.Date, jsonReader.TokenType);
85
Assert.AreEqual(new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0)), jsonReader.Value);
88
Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
89
Assert.AreEqual("Test3", jsonReader.Value);
92
Assert.AreEqual(JsonToken.String, jsonReader.TokenType);
93
Assert.AreEqual("Test3Value", jsonReader.Value);
96
Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
97
Assert.AreEqual("Test4", jsonReader.Value);
100
Assert.AreEqual(JsonToken.Null, jsonReader.TokenType);
101
Assert.AreEqual(null, jsonReader.Value);
103
Assert.IsTrue(jsonReader.Read());
104
Assert.AreEqual(JsonToken.EndObject, jsonReader.TokenType);
106
Assert.IsFalse(jsonReader.Read());
107
Assert.AreEqual(JsonToken.None, jsonReader.TokenType);
110
using (JsonReader jsonReader = new JTokenReader(o.Property("Test2")))
112
Assert.IsTrue(jsonReader.Read());
113
Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
114
Assert.AreEqual("Test2", jsonReader.Value);
116
Assert.IsTrue(jsonReader.Read());
117
Assert.AreEqual(JsonToken.Date, jsonReader.TokenType);
118
Assert.AreEqual(new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0)), jsonReader.Value);
120
Assert.IsFalse(jsonReader.Read());
121
Assert.AreEqual(JsonToken.None, jsonReader.TokenType);
126
public void ReadAsDateTimeOffsetBadString()
128
string json = @"{""Offset"":""blablahbla""}";
130
JObject o = JObject.Parse(json);
132
JsonReader reader = o.CreateReader();
134
Assert.IsTrue(reader.Read());
135
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
137
Assert.IsTrue(reader.Read());
138
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
140
ExceptionAssert.Throws<JsonReaderException>(
141
"Could not convert string to DateTimeOffset: blablahbla. Path 'Offset', line 1, position 22.",
144
reader.ReadAsDateTimeOffset();
149
public void ReadAsDateTimeOffsetBoolean()
151
string json = @"{""Offset"":true}";
153
JObject o = JObject.Parse(json);
155
JsonReader reader = o.CreateReader();
157
Assert.IsTrue(reader.Read());
158
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
160
Assert.IsTrue(reader.Read());
161
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
163
ExceptionAssert.Throws<JsonReaderException>(
164
"Error reading date. Unexpected token: Boolean. Path 'Offset', line 1, position 14.",
167
reader.ReadAsDateTimeOffset();
172
public void ReadAsDateTimeOffsetString()
174
string json = @"{""Offset"":""2012-01-24T03:50Z""}";
176
JObject o = JObject.Parse(json);
178
JsonReader reader = o.CreateReader();
180
Assert.IsTrue(reader.Read());
181
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
183
Assert.IsTrue(reader.Read());
184
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
186
reader.ReadAsDateTimeOffset();
187
Assert.AreEqual(JsonToken.Date, reader.TokenType);
188
Assert.AreEqual(typeof (DateTimeOffset), reader.ValueType);
189
Assert.AreEqual(new DateTimeOffset(2012, 1, 24, 3, 50, 0, TimeSpan.Zero), reader.Value);
194
public void ReadLineInfo()
200
""500 gigabyte hard drive""
204
StringReader sr = new StringReader(input);
206
JObject o = JObject.Parse(input);
208
using (JTokenReader jsonReader = new JTokenReader(o))
210
IJsonLineInfo lineInfo = jsonReader;
212
Assert.AreEqual(jsonReader.TokenType, JsonToken.None);
213
Assert.AreEqual(0, lineInfo.LineNumber);
214
Assert.AreEqual(0, lineInfo.LinePosition);
215
Assert.AreEqual(false, lineInfo.HasLineInfo());
218
Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
219
Assert.AreEqual(1, lineInfo.LineNumber);
220
Assert.AreEqual(1, lineInfo.LinePosition);
221
Assert.AreEqual(true, lineInfo.HasLineInfo());
224
Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
225
Assert.AreEqual(jsonReader.Value, "CPU");
226
Assert.AreEqual(2, lineInfo.LineNumber);
227
Assert.AreEqual(7, lineInfo.LinePosition);
228
Assert.AreEqual(true, lineInfo.HasLineInfo());
231
Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
232
Assert.AreEqual(jsonReader.Value, "Intel");
233
Assert.AreEqual(2, lineInfo.LineNumber);
234
Assert.AreEqual(15, lineInfo.LinePosition);
235
Assert.AreEqual(true, lineInfo.HasLineInfo());
238
Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
239
Assert.AreEqual(jsonReader.Value, "Drives");
240
Assert.AreEqual(3, lineInfo.LineNumber);
241
Assert.AreEqual(10, lineInfo.LinePosition);
242
Assert.AreEqual(true, lineInfo.HasLineInfo());
245
Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
246
Assert.AreEqual(3, lineInfo.LineNumber);
247
Assert.AreEqual(12, lineInfo.LinePosition);
248
Assert.AreEqual(true, lineInfo.HasLineInfo());
251
Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
252
Assert.AreEqual(jsonReader.Value, "DVD read/writer");
253
Assert.AreEqual(4, lineInfo.LineNumber);
254
Assert.AreEqual(22, lineInfo.LinePosition);
255
Assert.AreEqual(true, lineInfo.HasLineInfo());
258
Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
259
Assert.AreEqual(jsonReader.Value, "500 gigabyte hard drive");
260
Assert.AreEqual(5, lineInfo.LineNumber);
261
Assert.AreEqual(30, lineInfo.LinePosition);
262
Assert.AreEqual(true, lineInfo.HasLineInfo());
265
Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
266
Assert.AreEqual(0, lineInfo.LineNumber);
267
Assert.AreEqual(0, lineInfo.LinePosition);
268
Assert.AreEqual(false, lineInfo.HasLineInfo());
271
Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
272
Assert.AreEqual(0, lineInfo.LineNumber);
273
Assert.AreEqual(0, lineInfo.LinePosition);
274
Assert.AreEqual(false, lineInfo.HasLineInfo());
277
Assert.AreEqual(jsonReader.TokenType, JsonToken.None);
282
public void ReadBytes()
284
byte[] data = Encoding.UTF8.GetBytes("Hello world!");
288
new JProperty("Test1", data)
291
using (JTokenReader jsonReader = new JTokenReader(o))
294
Assert.AreEqual(JsonToken.StartObject, jsonReader.TokenType);
297
Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
298
Assert.AreEqual("Test1", jsonReader.Value);
300
byte[] readBytes = jsonReader.ReadAsBytes();
301
Assert.AreEqual(data, readBytes);
303
Assert.IsTrue(jsonReader.Read());
304
Assert.AreEqual(JsonToken.EndObject, jsonReader.TokenType);
306
Assert.IsFalse(jsonReader.Read());
307
Assert.AreEqual(JsonToken.None, jsonReader.TokenType);
312
public void ReadBytesFailure()
314
ExceptionAssert.Throws<JsonReaderException>(
315
"Error reading bytes. Unexpected token: Integer. Path 'Test1'.",
320
new JProperty("Test1", 1)
323
using (JTokenReader jsonReader = new JTokenReader(o))
326
Assert.AreEqual(JsonToken.StartObject, jsonReader.TokenType);
329
Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
330
Assert.AreEqual("Test1", jsonReader.Value);
332
jsonReader.ReadAsBytes();
337
public class HasBytes
339
public byte[] Bytes { get; set; }
343
public void ReadBytesFromString()
345
var bytes = new HasBytes { Bytes = new byte[] { 1, 2, 3, 4 } };
346
var json = JsonConvert.SerializeObject(bytes);
348
TextReader textReader = new StringReader(json);
349
JsonReader jsonReader = new JsonTextReader(textReader);
351
var jToken = JToken.ReadFrom(jsonReader);
353
jsonReader = new JTokenReader(jToken);
355
var result2 = (HasBytes)JsonSerializer.Create(null)
356
.Deserialize(jsonReader, typeof(HasBytes));
358
CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4 }, result2.Bytes);
362
public void ReadBytesFromEmptyString()
364
var bytes = new HasBytes { Bytes = new byte[0] };
365
var json = JsonConvert.SerializeObject(bytes);
367
TextReader textReader = new StringReader(json);
368
JsonReader jsonReader = new JsonTextReader(textReader);
370
var jToken = JToken.ReadFrom(jsonReader);
372
jsonReader = new JTokenReader(jToken);
374
var result2 = (HasBytes)JsonSerializer.Create(null)
375
.Deserialize(jsonReader, typeof(HasBytes));
377
CollectionAssert.AreEquivalent(new byte[0], result2.Bytes);
380
public class ReadAsBytesTestObject
386
public void ReadAsBytesNull()
388
JsonSerializer s = new JsonSerializer();
390
JToken nullToken = JToken.ReadFrom(new JsonTextReader(new StringReader("{ Data: null }")));
391
ReadAsBytesTestObject x = s.Deserialize<ReadAsBytesTestObject>(new JTokenReader(nullToken));
392
Assert.IsNull(x.Data);
396
public void DeserializeByteArrayWithTypeNameHandling()
398
TestObject test = new TestObject("Test", new byte[] { 72, 63, 62, 71, 92, 55 });
400
string json = JsonConvert.SerializeObject(test, Formatting.Indented, new JsonSerializerSettings
402
TypeNameHandling = TypeNameHandling.All
405
JObject o = JObject.Parse(json);
407
JsonSerializer serializer = new JsonSerializer();
408
serializer.TypeNameHandling = TypeNameHandling.All;
410
using (JsonReader nodeReader = o.CreateReader())
412
// Get exception here
413
TestObject newObject = (TestObject)serializer.Deserialize(nodeReader);
415
Assert.AreEqual("Test", newObject.Name);
416
CollectionAssert.AreEquivalent(new byte[] { 72, 63, 62, 71, 92, 55 }, newObject.Data);
421
public void DeserializeStringInt()
424
""PreProperty"": ""99"",
425
""PostProperty"": ""-1""
428
JObject o = JObject.Parse(json);
430
JsonSerializer serializer = new JsonSerializer();
432
using (JsonReader nodeReader = o.CreateReader())
434
MyClass c = serializer.Deserialize<MyClass>(nodeReader);
436
Assert.AreEqual(99, c.PreProperty);
437
Assert.AreEqual(-1, c.PostProperty);
442
public void ReadAsDecimalInt()
444
string json = @"{""Name"":1}";
446
JObject o = JObject.Parse(json);
448
JsonReader reader = o.CreateReader();
450
Assert.IsTrue(reader.Read());
451
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
453
Assert.IsTrue(reader.Read());
454
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
456
reader.ReadAsDecimal();
457
Assert.AreEqual(JsonToken.Float, reader.TokenType);
458
Assert.AreEqual(typeof(decimal), reader.ValueType);
459
Assert.AreEqual(1m, reader.Value);
463
public void ReadAsInt32Int()
465
string json = @"{""Name"":1}";
467
JObject o = JObject.Parse(json);
469
JsonReader reader = o.CreateReader();
471
Assert.IsTrue(reader.Read());
472
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
474
Assert.IsTrue(reader.Read());
475
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
477
reader.ReadAsInt32();
478
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
479
Assert.AreEqual(typeof(int), reader.ValueType);
480
Assert.AreEqual(1, reader.Value);
484
public void ReadAsInt32BadString()
486
string json = @"{""Name"":""hi""}";
488
JObject o = JObject.Parse(json);
490
JsonReader reader = o.CreateReader();
492
Assert.IsTrue(reader.Read());
493
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
495
Assert.IsTrue(reader.Read());
496
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
498
ExceptionAssert.Throws<JsonReaderException>(
499
"Could not convert string to integer: hi. Path 'Name', line 1, position 12.",
502
reader.ReadAsInt32();
507
public void ReadAsInt32Boolean()
509
string json = @"{""Name"":true}";
511
JObject o = JObject.Parse(json);
513
JsonReader reader = o.CreateReader();
515
Assert.IsTrue(reader.Read());
516
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
518
Assert.IsTrue(reader.Read());
519
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
521
ExceptionAssert.Throws<JsonReaderException>(
522
"Error reading integer. Unexpected token: Boolean. Path 'Name', line 1, position 12.",
525
reader.ReadAsInt32();
530
public void ReadAsDecimalString()
532
string json = @"{""Name"":""1.1""}";
534
JObject o = JObject.Parse(json);
536
JsonReader reader = o.CreateReader();
538
Assert.IsTrue(reader.Read());
539
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
541
Assert.IsTrue(reader.Read());
542
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
544
reader.ReadAsDecimal();
545
Assert.AreEqual(JsonToken.Float, reader.TokenType);
546
Assert.AreEqual(typeof(decimal), reader.ValueType);
547
Assert.AreEqual(1.1m, reader.Value);
551
public void ReadAsDecimalBadString()
553
string json = @"{""Name"":""blah""}";
555
JObject o = JObject.Parse(json);
557
JsonReader reader = o.CreateReader();
559
Assert.IsTrue(reader.Read());
560
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
562
Assert.IsTrue(reader.Read());
563
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
565
ExceptionAssert.Throws<JsonReaderException>(
566
"Could not convert string to decimal: blah. Path 'Name', line 1, position 14.",
569
reader.ReadAsDecimal();
574
public void ReadAsDecimalBoolean()
576
string json = @"{""Name"":true}";
578
JObject o = JObject.Parse(json);
580
JsonReader reader = o.CreateReader();
582
Assert.IsTrue(reader.Read());
583
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
585
Assert.IsTrue(reader.Read());
586
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
588
ExceptionAssert.Throws<JsonReaderException>(
589
"Error reading decimal. Unexpected token: Boolean. Path 'Name', line 1, position 12.",
592
reader.ReadAsDecimal();
597
public void ReadAsDecimalNull()
599
string json = @"{""Name"":null}";
601
JObject o = JObject.Parse(json);
603
JsonReader reader = o.CreateReader();
605
Assert.IsTrue(reader.Read());
606
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
608
Assert.IsTrue(reader.Read());
609
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
611
reader.ReadAsDecimal();
612
Assert.AreEqual(JsonToken.Null, reader.TokenType);
613
Assert.AreEqual(null, reader.ValueType);
614
Assert.AreEqual(null, reader.Value);
b'\\ No newline at end of file'