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;
28
using System.Globalization;
31
using NUnit.Framework;
33
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
34
using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute;
35
using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute;
37
using Newtonsoft.Json;
40
using Newtonsoft.Json.Utilities;
42
namespace Newtonsoft.Json.Tests
45
public class JsonTextReaderTest : TestFixtureBase
48
public void SurrogatePairValid()
50
string json = @"{ ""MATHEMATICAL ITALIC CAPITAL ALPHA"": ""\uD835\uDEE2"" }";
52
JsonTextReader reader = new JsonTextReader(new StringReader(json));
54
Assert.IsTrue(reader.Read());
55
Assert.IsTrue(reader.Read());
57
Assert.IsTrue(reader.Read());
58
Assert.AreEqual(JsonToken.String, reader.TokenType);
60
string s = reader.Value.ToString();
61
Assert.AreEqual(2, s.Length);
63
StringInfo stringInfo = new StringInfo(s);
64
Assert.AreEqual(1, stringInfo.LengthInTextElements);
68
public void SurrogatePairReplacement()
70
// existing good surrogate pair
71
Assert.AreEqual("ABC \ud800\udc00 DEF", ReadString("ABC \\ud800\\udc00 DEF"));
73
// invalid surrogates (two high back-to-back)
74
Assert.AreEqual("ABC \ufffd\ufffd DEF", ReadString("ABC \\ud800\\ud800 DEF"));
76
// invalid surrogates (two high back-to-back)
77
Assert.AreEqual("ABC \ufffd\ufffd\u1234 DEF", ReadString("ABC \\ud800\\ud800\\u1234 DEF"));
79
// invalid surrogates (three high back-to-back)
80
Assert.AreEqual("ABC \ufffd\ufffd\ufffd DEF", ReadString("ABC \\ud800\\ud800\\ud800 DEF"));
82
// invalid surrogates (high followed by a good surrogate pair)
83
Assert.AreEqual("ABC \ufffd\ud800\udc00 DEF", ReadString("ABC \\ud800\\ud800\\udc00 DEF"));
85
// invalid high surrogate at end of string
86
Assert.AreEqual("ABC \ufffd", ReadString("ABC \\ud800"));
88
// high surrogate not followed by low surrogate
89
Assert.AreEqual("ABC \ufffd DEF", ReadString("ABC \\ud800 DEF"));
91
// low surrogate not preceded by high surrogate
92
Assert.AreEqual("ABC \ufffd\ufffd DEF", ReadString("ABC \\udc00\\ud800 DEF"));
94
// make sure unencoded invalid surrogate characters don't make it through
95
Assert.AreEqual("\ufffd\ufffd\ufffd", ReadString("\udc00\ud800\ud800"));
97
Assert.AreEqual("ABC \ufffd\b", ReadString("ABC \\ud800\\b"));
98
Assert.AreEqual("ABC \ufffd ", ReadString("ABC \\ud800 "));
99
Assert.AreEqual("ABC \b\ufffd", ReadString("ABC \\b\\ud800"));
102
private string ReadString(string input)
104
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(@"""" + input + @""""));
106
JsonTextReader reader = new JsonTextReader(new StreamReader(ms));
109
string s = (string)reader.Value;
115
public void CloseInput()
117
MemoryStream ms = new MemoryStream();
118
JsonTextReader reader = new JsonTextReader(new StreamReader(ms));
120
Assert.IsTrue(ms.CanRead);
122
Assert.IsFalse(ms.CanRead);
124
ms = new MemoryStream();
125
reader = new JsonTextReader(new StreamReader(ms)) { CloseInput = false };
127
Assert.IsTrue(ms.CanRead);
129
Assert.IsTrue(ms.CanRead);
133
public void YahooFinance()
137
{""t"":""C"", ""n"":""Citigroup Inc."", ""e"":""NYSE"", ""id"":""662713""}
138
,{""t"":""CHL"", ""n"":""China Mobile Ltd. (ADR)"", ""e"":""NYSE"", ""id"":""660998""}
139
,{""t"":""PTR"", ""n"":""PetroChina Company Limited (ADR)"", ""e"":""NYSE"", ""id"":""664536""}
140
,{""t"":""RIO"", ""n"":""Companhia Vale do Rio Doce (ADR)"", ""e"":""NYSE"", ""id"":""671472""}
141
,{""t"":""RIOPR"", ""n"":""Companhia Vale do Rio Doce (ADR)"", ""e"":""NYSE"", ""id"":""3512643""}
142
,{""t"":""CSCO"", ""n"":""Cisco Systems, Inc."", ""e"":""NASDAQ"", ""id"":""99624""}
143
,{""t"":""CVX"", ""n"":""Chevron Corporation"", ""e"":""NYSE"", ""id"":""667226""}
144
,{""t"":""TM"", ""n"":""Toyota Motor Corporation (ADR)"", ""e"":""NYSE"", ""id"":""655880""}
145
,{""t"":""JPM"", ""n"":""JPMorgan Chase \\x26 Co."", ""e"":""NYSE"", ""id"":""665639""}
146
,{""t"":""COP"", ""n"":""ConocoPhillips"", ""e"":""NYSE"", ""id"":""1691168""}
147
,{""t"":""LFC"", ""n"":""China Life Insurance Company Ltd. (ADR)"", ""e"":""NYSE"", ""id"":""688679""}
148
,{""t"":""NOK"", ""n"":""Nokia Corporation (ADR)"", ""e"":""NYSE"", ""id"":""657729""}
149
,{""t"":""KO"", ""n"":""The Coca-Cola Company"", ""e"":""NYSE"", ""id"":""6550""}
150
,{""t"":""VZ"", ""n"":""Verizon Communications Inc."", ""e"":""NYSE"", ""id"":""664887""}
151
,{""t"":""AMX"", ""n"":""America Movil S.A.B de C.V. (ADR)"", ""e"":""NYSE"", ""id"":""665834""}],
156
using (JsonReader jsonReader = new JsonTextReader(new StringReader(input)))
158
while (jsonReader.Read())
160
Console.WriteLine(jsonReader.Value);
166
public void ReadConstructor()
168
string json = @"{""DefaultConverter"":new Date(0, ""hi""),""MemberConverter"":""1970-01-01T00:00:00Z""}";
170
JsonReader reader = new JsonTextReader(new StreamReader(new SlowStream(json, new UTF8Encoding(false), 1)));
172
Assert.IsTrue(reader.Read());
173
Assert.IsTrue(reader.Read());
174
Assert.IsTrue(reader.Read());
175
Assert.AreEqual(JsonToken.StartConstructor, reader.TokenType);
176
Assert.AreEqual("Date", reader.Value);
178
Assert.IsTrue(reader.Read());
179
Assert.AreEqual(0L, reader.Value);
181
Assert.IsTrue(reader.Read());
182
Assert.AreEqual("hi", reader.Value);
184
Assert.IsTrue(reader.Read());
185
Assert.AreEqual(JsonToken.EndConstructor, reader.TokenType);
187
Assert.IsTrue(reader.Read());
188
Assert.AreEqual("MemberConverter", reader.Value);
192
public void ParseAdditionalContent_Comma()
200
JsonTextReader reader = new JsonTextReader(new StringReader(json));
202
ExceptionAssert.Throws<JsonReaderException>(
203
"Additional text encountered after finished reading JSON content: ,. Path '', line 5, position 2.",
206
while (reader.Read())
213
public void ParseAdditionalContent_Text()
221
JsonTextReader reader = new JsonTextReader(new StringReader(json));
222
reader.SetCharBuffer(new char[2]);
225
Assert.AreEqual(1, reader.LineNumber);
228
Assert.AreEqual(2, reader.LineNumber);
231
Assert.AreEqual(3, reader.LineNumber);
234
Assert.AreEqual(4, reader.LineNumber);
237
Assert.AreEqual(5, reader.LineNumber);
239
ExceptionAssert.Throws<JsonReaderException>(
240
"Additional text encountered after finished reading JSON content: c. Path '', line 5, position 2.",
248
public void ParseAdditionalContent_Whitespace()
258
JsonTextReader reader = new JsonTextReader(new StringReader(json));
259
while (reader.Read())
265
public void ParseAdditionalContent_WhitespaceThenText()
267
string json = @"'hi' a";
269
JsonTextReader reader = new JsonTextReader(new StringReader(json));
271
ExceptionAssert.Throws<JsonReaderException>(
272
"Additional text encountered after finished reading JSON content: a. Path '', line 1, position 5.",
275
while (reader.Read())
282
public void ReadingIndented()
288
""500 gigabyte hard drive""
292
StringReader sr = new StringReader(input);
294
using (JsonTextReader jsonReader = new JsonTextReader(sr))
296
jsonReader.SetCharBuffer(new char[5]);
298
Assert.AreEqual(jsonReader.TokenType, JsonToken.None);
299
Assert.AreEqual(0, jsonReader.LineNumber);
300
Assert.AreEqual(0, jsonReader.LinePosition);
303
Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
304
Assert.AreEqual(1, jsonReader.LineNumber);
305
Assert.AreEqual(1, jsonReader.LinePosition);
308
Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
309
Assert.AreEqual(jsonReader.Value, "CPU");
310
Assert.AreEqual(2, jsonReader.LineNumber);
311
Assert.AreEqual(7, jsonReader.LinePosition);
314
Assert.AreEqual(JsonToken.String, jsonReader.TokenType);
315
Assert.AreEqual("Intel", jsonReader.Value);
316
Assert.AreEqual(2, jsonReader.LineNumber);
317
Assert.AreEqual(15, jsonReader.LinePosition);
320
Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
321
Assert.AreEqual(jsonReader.Value, "Drives");
322
Assert.AreEqual(3, jsonReader.LineNumber);
323
Assert.AreEqual(10, jsonReader.LinePosition);
326
Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
327
Assert.AreEqual(3, jsonReader.LineNumber);
328
Assert.AreEqual(12, jsonReader.LinePosition);
331
Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
332
Assert.AreEqual(jsonReader.Value, "DVD read/writer");
333
Assert.AreEqual(jsonReader.QuoteChar, '\'');
334
Assert.AreEqual(4, jsonReader.LineNumber);
335
Assert.AreEqual(22, jsonReader.LinePosition);
338
Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
339
Assert.AreEqual(jsonReader.Value, "500 gigabyte hard drive");
340
Assert.AreEqual(jsonReader.QuoteChar, '"');
341
Assert.AreEqual(5, jsonReader.LineNumber);
342
Assert.AreEqual(30, jsonReader.LinePosition);
345
Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
346
Assert.AreEqual(6, jsonReader.LineNumber);
347
Assert.AreEqual(4, jsonReader.LinePosition);
350
Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
351
Assert.AreEqual(7, jsonReader.LineNumber);
352
Assert.AreEqual(2, jsonReader.LinePosition);
354
Assert.IsFalse(jsonReader.Read());
363
array:[1,2,new Date(1)],
364
subobject:{prop:1,proparray:[1]}
367
StringReader sr = new StringReader(input);
369
using (JsonReader reader = new JsonTextReader(sr))
371
Assert.AreEqual(0, reader.Depth);
374
Assert.AreEqual(reader.TokenType, JsonToken.StartObject);
375
Assert.AreEqual(0, reader.Depth);
376
Assert.AreEqual("", reader.Path);
379
Assert.AreEqual(reader.TokenType, JsonToken.PropertyName);
380
Assert.AreEqual(1, reader.Depth);
381
Assert.AreEqual("value", reader.Path);
384
Assert.AreEqual(reader.TokenType, JsonToken.String);
385
Assert.AreEqual(reader.Value, @"Purple");
386
Assert.AreEqual(reader.QuoteChar, '\'');
387
Assert.AreEqual(1, reader.Depth);
388
Assert.AreEqual("value", reader.Path);
391
Assert.AreEqual(reader.TokenType, JsonToken.PropertyName);
392
Assert.AreEqual(1, reader.Depth);
393
Assert.AreEqual("array", reader.Path);
396
Assert.AreEqual(reader.TokenType, JsonToken.StartArray);
397
Assert.AreEqual(1, reader.Depth);
398
Assert.AreEqual("array", reader.Path);
401
Assert.AreEqual(reader.TokenType, JsonToken.Integer);
402
Assert.AreEqual(1L, reader.Value);
403
Assert.AreEqual(2, reader.Depth);
404
Assert.AreEqual("array[0]", reader.Path);
407
Assert.AreEqual(reader.TokenType, JsonToken.Integer);
408
Assert.AreEqual(2L, reader.Value);
409
Assert.AreEqual(2, reader.Depth);
410
Assert.AreEqual("array[1]", reader.Path);
413
Assert.AreEqual(reader.TokenType, JsonToken.StartConstructor);
414
Assert.AreEqual("Date", reader.Value);
415
Assert.AreEqual(2, reader.Depth);
416
Assert.AreEqual("array[2]", reader.Path);
419
Assert.AreEqual(reader.TokenType, JsonToken.Integer);
420
Assert.AreEqual(1L, reader.Value);
421
Assert.AreEqual(3, reader.Depth);
422
Assert.AreEqual("array[2][0]", reader.Path);
425
Assert.AreEqual(reader.TokenType, JsonToken.EndConstructor);
426
Assert.AreEqual(null, reader.Value);
427
Assert.AreEqual(2, reader.Depth);
428
Assert.AreEqual("array[2]", reader.Path);
431
Assert.AreEqual(reader.TokenType, JsonToken.EndArray);
432
Assert.AreEqual(1, reader.Depth);
433
Assert.AreEqual("array", reader.Path);
436
Assert.AreEqual(reader.TokenType, JsonToken.PropertyName);
437
Assert.AreEqual(1, reader.Depth);
438
Assert.AreEqual("subobject", reader.Path);
441
Assert.AreEqual(reader.TokenType, JsonToken.StartObject);
442
Assert.AreEqual(1, reader.Depth);
443
Assert.AreEqual("subobject", reader.Path);
446
Assert.AreEqual(reader.TokenType, JsonToken.PropertyName);
447
Assert.AreEqual(2, reader.Depth);
448
Assert.AreEqual("subobject.prop", reader.Path);
451
Assert.AreEqual(reader.TokenType, JsonToken.Integer);
452
Assert.AreEqual(2, reader.Depth);
453
Assert.AreEqual("subobject.prop", reader.Path);
456
Assert.AreEqual(reader.TokenType, JsonToken.PropertyName);
457
Assert.AreEqual(2, reader.Depth);
458
Assert.AreEqual("subobject.proparray", reader.Path);
461
Assert.AreEqual(reader.TokenType, JsonToken.StartArray);
462
Assert.AreEqual(2, reader.Depth);
463
Assert.AreEqual("subobject.proparray", reader.Path);
466
Assert.AreEqual(reader.TokenType, JsonToken.Integer);
467
Assert.AreEqual(3, reader.Depth);
468
Assert.AreEqual("subobject.proparray[0]", reader.Path);
471
Assert.AreEqual(reader.TokenType, JsonToken.EndArray);
472
Assert.AreEqual(2, reader.Depth);
473
Assert.AreEqual("subobject.proparray", reader.Path);
476
Assert.AreEqual(reader.TokenType, JsonToken.EndObject);
477
Assert.AreEqual(1, reader.Depth);
478
Assert.AreEqual("subobject", reader.Path);
481
Assert.AreEqual(reader.TokenType, JsonToken.EndObject);
482
Assert.AreEqual(0, reader.Depth);
483
Assert.AreEqual("", reader.Path);
488
public void NullTextReader()
490
ExceptionAssert.Throws<ArgumentNullException>(
491
@"Value cannot be null.
492
Parameter name: reader",
495
new JsonTextReader(null);
500
public void UnexpectedEndOfString()
502
JsonReader reader = new JsonTextReader(new StringReader("'hi"));
504
ExceptionAssert.Throws<JsonReaderException>(
505
"Unterminated string. Expected delimiter: '. Path '', line 1, position 3.",
513
public void ReadLongString()
515
string s = new string('a', 10000);
516
JsonReader reader = new JsonTextReader(new StringReader("'" + s + "'"));
519
Assert.AreEqual(s, reader.Value);
523
public void ReadLongJsonArray()
525
int valueCount = 10000;
526
StringWriter sw = new StringWriter();
527
JsonTextWriter writer = new JsonTextWriter(sw);
528
writer.WriteStartArray();
529
for (int i = 0; i < valueCount; i++)
531
writer.WriteValue(i);
533
writer.WriteEndArray();
535
string json = sw.ToString();
537
JsonTextReader reader = new JsonTextReader(new StringReader(json));
538
Assert.IsTrue(reader.Read());
539
for (int i = 0; i < valueCount; i++)
541
Assert.IsTrue(reader.Read());
542
Assert.AreEqual((long)i, reader.Value);
544
Assert.IsTrue(reader.Read());
545
Assert.IsFalse(reader.Read());
549
public void NullCharReading()
551
string json = "\0{\0'\0h\0i\0'\0:\0[\01\0,\0'\0'\0\0,\0null\0]\0,\0do\0:true\0}\0\0/*\0sd\0f\0*/\0/*\0sd\0f\0*/ \0";
552
JsonTextReader reader = new JsonTextReader(new StreamReader(new SlowStream(json, new UTF8Encoding(false), 1)));
554
Assert.IsTrue(reader.Read());
555
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
557
Assert.IsTrue(reader.Read());
558
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
560
Assert.IsTrue(reader.Read());
561
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
563
Assert.IsTrue(reader.Read());
564
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
566
Assert.IsTrue(reader.Read());
567
Assert.AreEqual(JsonToken.String, reader.TokenType);
569
Assert.IsTrue(reader.Read());
570
Assert.AreEqual(JsonToken.Null, reader.TokenType);
572
Assert.IsTrue(reader.Read());
573
Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
575
Assert.IsTrue(reader.Read());
576
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
578
Assert.IsTrue(reader.Read());
579
Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
581
Assert.IsTrue(reader.Read());
582
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
584
Assert.IsTrue(reader.Read());
585
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
586
Assert.AreEqual("\0sd\0f\0", reader.Value);
588
Assert.IsTrue(reader.Read());
589
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
590
Assert.AreEqual("\0sd\0f\0", reader.Value);
592
Assert.IsFalse(reader.Read());
596
public void AppendCharsWhileReadingNull()
617
JsonTextReader reader = new JsonTextReader(new StringReader(json));
618
reader.SetCharBuffer(new char[129]);
620
for (int i = 0; i < 15; i++)
626
Assert.AreEqual(JsonToken.Null, reader.TokenType);
630
public void AppendCharsWhileReadingNewLine()
634
""description"": ""A person"",
635
""type"": ""object"",
638
""name"": {""type"":""string""},
641
""items"": {""type"":""string""}
647
JsonTextReader reader = new JsonTextReader(new StringReader(json));
648
reader.SetCharBuffer(new char[129]);
650
for (int i = 0; i < 14; i++)
652
Assert.IsTrue(reader.Read());
655
Assert.IsTrue(reader.Read());
656
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
657
Assert.AreEqual("type", reader.Value);
661
public void ReadNullTerminatorStrings()
663
JsonReader reader = new JsonTextReader(new StringReader("'h\0i'"));
664
Assert.IsTrue(reader.Read());
666
Assert.AreEqual("h\0i", reader.Value);
670
public void UnexpectedEndOfHex()
672
JsonReader reader = new JsonTextReader(new StringReader(@"'h\u123"));
674
ExceptionAssert.Throws<JsonReaderException>(
675
"Unexpected end while parsing unicode character. Path '', line 1, position 4.",
683
public void UnexpectedEndOfControlCharacter()
685
JsonReader reader = new JsonTextReader(new StringReader(@"'h\"));
687
ExceptionAssert.Throws<JsonReaderException>(
688
"Unterminated string. Expected delimiter: '. Path '', line 1, position 3.",
696
public void ReadBytesWithBadCharacter()
698
JsonReader reader = new JsonTextReader(new StringReader(@"true"));
700
ExceptionAssert.Throws<JsonReaderException>(
701
"Error reading bytes. Unexpected token: Boolean. Path '', line 1, position 4.",
704
reader.ReadAsBytes();
709
public void ReadBytesWithUnexpectedEnd()
711
string helloWorld = "Hello world!";
712
byte[] helloWorldData = Encoding.UTF8.GetBytes(helloWorld);
714
JsonReader reader = new JsonTextReader(new StringReader(@"'" + Convert.ToBase64String(helloWorldData)));
716
ExceptionAssert.Throws<JsonReaderException>(
717
"Unterminated string. Expected delimiter: '. Path '', line 1, position 17.",
720
reader.ReadAsBytes();
725
public void ReadBytesNoStartWithUnexpectedEnd()
727
JsonReader reader = new JsonTextReader(new StringReader(@"[ "));
728
Assert.IsTrue(reader.Read());
730
Assert.IsNull(reader.ReadAsBytes());
731
Assert.AreEqual(JsonToken.None, reader.TokenType);
735
public void UnexpectedEndWhenParsingUnquotedProperty()
737
JsonReader reader = new JsonTextReader(new StringReader(@"{aww"));
738
Assert.IsTrue(reader.Read());
740
ExceptionAssert.Throws<JsonReaderException>(
741
"Unexpected end while parsing unquoted property name. Path '', line 1, position 4.",
749
public void ReadNewLines()
751
string newLinesText = StringUtils.CarriageReturn + StringUtils.CarriageReturnLineFeed + StringUtils.LineFeed + StringUtils.CarriageReturnLineFeed + " " + StringUtils.CarriageReturn + StringUtils.CarriageReturnLineFeed;
757
+ "name1" + newLinesText
761
+ "new" + newLinesText
762
+ "Date" + newLinesText
766
+ "null" + newLinesText
767
+ "/*" + newLinesText
768
+ "blah comment" + newLinesText
769
+ "*/" + newLinesText
772
+ "1.1111" + newLinesText
775
+ "name2" + newLinesText
779
+ "}" + newLinesText;
782
StringReader sr = new StringReader(newLinesText);
783
while (sr.ReadLine() != null)
788
JsonTextReader reader = new JsonTextReader(new StreamReader(new SlowStream(json, new UTF8Encoding(false), 1)));
789
Assert.IsTrue(reader.Read());
790
Assert.AreEqual(7, reader.LineNumber);
792
Assert.IsTrue(reader.Read());
793
Assert.AreEqual(31, reader.LineNumber);
794
Assert.AreEqual(newLinesText + "name1" + newLinesText, reader.Value);
796
Assert.IsTrue(reader.Read());
797
Assert.AreEqual(37, reader.LineNumber);
799
Assert.IsTrue(reader.Read());
800
Assert.AreEqual(55, reader.LineNumber);
801
Assert.AreEqual(JsonToken.StartConstructor, reader.TokenType);
802
Assert.AreEqual("Date", reader.Value);
804
Assert.IsTrue(reader.Read());
805
Assert.AreEqual(61, reader.LineNumber);
806
Assert.AreEqual(1L, reader.Value);
808
Assert.IsTrue(reader.Read());
809
Assert.AreEqual(73, reader.LineNumber);
810
Assert.AreEqual(null, reader.Value);
812
Assert.IsTrue(reader.Read());
813
Assert.AreEqual(91, reader.LineNumber);
814
Assert.AreEqual(newLinesText + "blah comment" + newLinesText, reader.Value);
816
Assert.IsTrue(reader.Read());
817
Assert.AreEqual(97, reader.LineNumber);
819
Assert.IsTrue(reader.Read());
820
Assert.AreEqual(109, reader.LineNumber);
822
Assert.IsTrue(reader.Read());
823
Assert.AreEqual(115, reader.LineNumber);
825
Assert.IsTrue(reader.Read());
826
Assert.AreEqual(133, reader.LineNumber);
827
Assert.AreEqual("name2", reader.Value);
829
Assert.IsTrue(reader.Read());
830
Assert.AreEqual(139, reader.LineNumber);
832
Assert.IsTrue(reader.Read());
833
Assert.AreEqual(145, reader.LineNumber);
835
Assert.IsTrue(reader.Read());
836
Assert.AreEqual(151, reader.LineNumber);
840
public void ParsingQuotedPropertyWithControlCharacters()
842
JsonReader reader = new JsonTextReader(new StringReader(@"{'hi\r\nbye':1}"));
843
Assert.IsTrue(reader.Read());
844
Assert.IsTrue(reader.Read());
845
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
848
Assert.IsTrue(reader.Read());
849
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
850
Assert.AreEqual(1L, reader.Value);
851
Assert.IsTrue(reader.Read());
852
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
853
Assert.IsFalse(reader.Read());
857
public void ReadBytesFollowingNumberInArray()
859
string helloWorld = "Hello world!";
860
byte[] helloWorldData = Encoding.UTF8.GetBytes(helloWorld);
862
JsonReader reader = new JsonTextReader(new StringReader(@"[1,'" + Convert.ToBase64String(helloWorldData) + @"']"));
863
Assert.IsTrue(reader.Read());
864
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
865
Assert.IsTrue(reader.Read());
866
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
867
byte[] data = reader.ReadAsBytes();
868
CollectionAssert.AreEquivalent(helloWorldData, data);
869
Assert.AreEqual(JsonToken.Bytes, reader.TokenType);
870
Assert.IsTrue(reader.Read());
871
Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
873
Assert.IsFalse(reader.Read());
877
public void ReadBytesFollowingNumberInObject()
879
string helloWorld = "Hello world!";
880
byte[] helloWorldData = Encoding.UTF8.GetBytes(helloWorld);
882
JsonReader reader = new JsonTextReader(new StringReader(@"{num:1,data:'" + Convert.ToBase64String(helloWorldData) + @"'}"));
883
Assert.IsTrue(reader.Read());
884
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
885
Assert.IsTrue(reader.Read());
886
Assert.IsTrue(reader.Read());
887
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
888
Assert.IsTrue(reader.Read());
889
byte[] data = reader.ReadAsBytes();
890
CollectionAssert.AreEquivalent(helloWorldData, data);
891
Assert.AreEqual(JsonToken.Bytes, reader.TokenType);
892
Assert.IsTrue(reader.Read());
893
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
895
Assert.IsFalse(reader.Read());
899
public void ReadingEscapedStrings()
901
string input = "{value:'Purple\\r \\n monkey\\'s:\\tdishwasher'}";
903
StringReader sr = new StringReader(input);
905
using (JsonReader jsonReader = new JsonTextReader(sr))
907
Assert.AreEqual(0, jsonReader.Depth);
910
Assert.AreEqual(JsonToken.StartObject, jsonReader.TokenType);
911
Assert.AreEqual(0, jsonReader.Depth);
914
Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
915
Assert.AreEqual(1, jsonReader.Depth);
918
Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
919
Assert.AreEqual("Purple\r \n monkey's:\tdishwasher", jsonReader.Value);
920
Assert.AreEqual('\'', jsonReader.QuoteChar);
921
Assert.AreEqual(1, jsonReader.Depth);
924
Assert.AreEqual(JsonToken.EndObject, jsonReader.TokenType);
925
Assert.AreEqual(0, jsonReader.Depth);
930
public void ReadNewlineLastCharacter()
934
Drives: [ /* Com*ment */
936
""500 gigabyte hard drive""
940
object o = JsonConvert.DeserializeObject(input);
944
public void ReadRandomJson()
950
""string"": ""how now brown cow?"",
958
""decimal"": 990.00990099
963
""This is a string."",
968
JsonTextReader reader = new JsonTextReader(new StringReader(json));
969
while (reader.Read())
976
public void WriteReadWrite()
978
StringBuilder sb = new StringBuilder();
979
StringWriter sw = new StringWriter(sb);
981
using (JsonWriter jsonWriter = new JsonTextWriter(sw)
983
Formatting = Formatting.Indented
986
jsonWriter.WriteStartArray();
987
jsonWriter.WriteValue(true);
989
jsonWriter.WriteStartObject();
990
jsonWriter.WritePropertyName("integer");
991
jsonWriter.WriteValue(99);
992
jsonWriter.WritePropertyName("string");
993
jsonWriter.WriteValue("how now brown cow?");
994
jsonWriter.WritePropertyName("array");
996
jsonWriter.WriteStartArray();
997
for (int i = 0; i < 5; i++)
999
jsonWriter.WriteValue(i);
1002
jsonWriter.WriteStartObject();
1003
jsonWriter.WritePropertyName("decimal");
1004
jsonWriter.WriteValue(990.00990099m);
1005
jsonWriter.WriteEndObject();
1007
jsonWriter.WriteValue(5);
1008
jsonWriter.WriteEndArray();
1010
jsonWriter.WriteEndObject();
1012
jsonWriter.WriteValue("This is a string.");
1013
jsonWriter.WriteNull();
1014
jsonWriter.WriteNull();
1015
jsonWriter.WriteEndArray();
1018
string json = sb.ToString();
1020
JsonSerializer serializer = new JsonSerializer();
1022
object jsonObject = serializer.Deserialize(new JsonTextReader(new StringReader(json)));
1024
sb = new StringBuilder();
1025
sw = new StringWriter(sb);
1027
using (JsonWriter jsonWriter = new JsonTextWriter(sw)
1029
Formatting = Formatting.Indented
1032
serializer.Serialize(jsonWriter, jsonObject);
1035
Assert.AreEqual(json, sb.ToString());
1039
public void FloatingPointNonFiniteNumbers()
1047
StringReader sr = new StringReader(input);
1049
using (JsonReader jsonReader = new JsonTextReader(sr))
1052
Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
1055
Assert.AreEqual(jsonReader.TokenType, JsonToken.Float);
1056
Assert.AreEqual(jsonReader.Value, double.NaN);
1059
Assert.AreEqual(jsonReader.TokenType, JsonToken.Float);
1060
Assert.AreEqual(jsonReader.Value, double.PositiveInfinity);
1063
Assert.AreEqual(jsonReader.TokenType, JsonToken.Float);
1064
Assert.AreEqual(jsonReader.Value, double.NegativeInfinity);
1067
Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
1072
public void LongStringTest()
1075
string json = @"[""" + new string(' ', length) + @"""]";
1077
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1080
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
1083
Assert.AreEqual(JsonToken.String, reader.TokenType);
1084
Assert.AreEqual(typeof(string), reader.ValueType);
1085
Assert.AreEqual(20000, reader.Value.ToString().Length);
1087
Assert.IsTrue(reader.Read());
1088
Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
1090
Assert.IsFalse(reader.Read());
1091
Assert.AreEqual(JsonToken.None, reader.TokenType);
1095
public void EscapedUnicodeText()
1097
string json = @"[""\u003c"",""\u5f20""]";
1099
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1100
reader.SetCharBuffer(new char[2]);
1103
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
1106
Assert.AreEqual("<", reader.Value);
1109
Assert.AreEqual(24352, Convert.ToInt32(Convert.ToChar((string)reader.Value)));
1112
Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
1116
public void ReadFloatingPointNumber()
1119
@"[0.0,0.0,0.1,1.0,1.000001,1E-06,4.94065645841247E-324,Infinity,-Infinity,NaN,1.7976931348623157E+308,-1.7976931348623157E+308,Infinity,-Infinity,NaN,0e-10,0.25e-5,0.3e10]";
1121
using (JsonReader jsonReader = new JsonTextReader(new StringReader(json)))
1124
Assert.AreEqual(JsonToken.StartArray, jsonReader.TokenType);
1127
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1128
Assert.AreEqual(0.0, jsonReader.Value);
1131
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1132
Assert.AreEqual(0.0, jsonReader.Value);
1135
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1136
Assert.AreEqual(0.1, jsonReader.Value);
1139
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1140
Assert.AreEqual(1.0, jsonReader.Value);
1143
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1144
Assert.AreEqual(1.000001, jsonReader.Value);
1147
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1148
Assert.AreEqual(1E-06, jsonReader.Value);
1151
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1152
Assert.AreEqual(4.94065645841247E-324, jsonReader.Value);
1155
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1156
Assert.AreEqual(double.PositiveInfinity, jsonReader.Value);
1159
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1160
Assert.AreEqual(double.NegativeInfinity, jsonReader.Value);
1163
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1164
Assert.AreEqual(double.NaN, jsonReader.Value);
1167
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1168
Assert.AreEqual(double.MaxValue, jsonReader.Value);
1171
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1172
Assert.AreEqual(double.MinValue, jsonReader.Value);
1175
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1176
Assert.AreEqual(double.PositiveInfinity, jsonReader.Value);
1179
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1180
Assert.AreEqual(double.NegativeInfinity, jsonReader.Value);
1183
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1184
Assert.AreEqual(double.NaN, jsonReader.Value);
1187
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1188
Assert.AreEqual(0d, jsonReader.Value);
1191
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1192
Assert.AreEqual(0.0000025d, jsonReader.Value);
1195
Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
1196
Assert.AreEqual(3000000000d, jsonReader.Value);
1199
Assert.AreEqual(JsonToken.EndArray, jsonReader.TokenType);
1204
public void MissingColon()
1210
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1213
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1216
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1219
Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
1221
ExceptionAssert.Throws<JsonReaderException>(
1222
@"Invalid character after parsing property name. Expected ':' but got: "". Path 'A', line 3, position 9.",
1230
public void ReadSingleBytes()
1232
StringReader s = new StringReader(@"""SGVsbG8gd29ybGQu""");
1233
JsonTextReader reader = new JsonTextReader(s);
1235
byte[] data = reader.ReadAsBytes();
1236
Assert.IsNotNull(data);
1238
string text = Encoding.UTF8.GetString(data, 0, data.Length);
1239
Assert.AreEqual("Hello world.", text);
1243
public void ReadOctalNumber()
1245
StringReader s = new StringReader(@"[0372, 0xFA, 0XFA]");
1246
JsonTextReader jsonReader = new JsonTextReader(s);
1248
Assert.IsTrue(jsonReader.Read());
1249
Assert.AreEqual(JsonToken.StartArray, jsonReader.TokenType);
1251
Assert.IsTrue(jsonReader.Read());
1252
Assert.AreEqual(JsonToken.Integer, jsonReader.TokenType);
1253
Assert.AreEqual(250L, jsonReader.Value);
1255
Assert.IsTrue(jsonReader.Read());
1256
Assert.AreEqual(JsonToken.Integer, jsonReader.TokenType);
1257
Assert.AreEqual(250L, jsonReader.Value);
1259
Assert.IsTrue(jsonReader.Read());
1260
Assert.AreEqual(JsonToken.Integer, jsonReader.TokenType);
1261
Assert.AreEqual(250L, jsonReader.Value);
1263
Assert.IsTrue(jsonReader.Read());
1264
Assert.AreEqual(JsonToken.EndArray, jsonReader.TokenType);
1266
Assert.IsFalse(jsonReader.Read());
1270
public void ReadOctalNumberAsInt32()
1272
StringReader s = new StringReader(@"[0372, 0xFA, 0XFA]");
1273
JsonTextReader jsonReader = new JsonTextReader(s);
1275
Assert.IsTrue(jsonReader.Read());
1276
Assert.AreEqual(JsonToken.StartArray, jsonReader.TokenType);
1278
jsonReader.ReadAsInt32();
1279
Assert.AreEqual(JsonToken.Integer, jsonReader.TokenType);
1280
Assert.AreEqual(typeof(int), jsonReader.ValueType);
1281
Assert.AreEqual(250, jsonReader.Value);
1283
jsonReader.ReadAsInt32();
1284
Assert.AreEqual(JsonToken.Integer, jsonReader.TokenType);
1285
Assert.AreEqual(typeof(int), jsonReader.ValueType);
1286
Assert.AreEqual(250, jsonReader.Value);
1288
jsonReader.ReadAsInt32();
1289
Assert.AreEqual(JsonToken.Integer, jsonReader.TokenType);
1290
Assert.AreEqual(typeof(int), jsonReader.ValueType);
1291
Assert.AreEqual(250, jsonReader.Value);
1293
Assert.IsTrue(jsonReader.Read());
1294
Assert.AreEqual(JsonToken.EndArray, jsonReader.TokenType);
1296
Assert.IsFalse(jsonReader.Read());
1300
public void ReadBadCharInArray()
1302
JsonTextReader reader = new JsonTextReader(new StringReader(@"[}"));
1306
ExceptionAssert.Throws<JsonReaderException>(
1307
"Unexpected character encountered while parsing value: }. Path '', line 1, position 1.",
1315
public void ReadAsDecimalNoContent()
1317
JsonTextReader reader = new JsonTextReader(new StringReader(@""));
1319
Assert.IsNull(reader.ReadAsDecimal());
1320
Assert.AreEqual(JsonToken.None, reader.TokenType);
1324
public void ReadAsBytesNoContent()
1326
JsonTextReader reader = new JsonTextReader(new StringReader(@""));
1328
Assert.IsNull(reader.ReadAsBytes());
1329
Assert.AreEqual(JsonToken.None, reader.TokenType);
1333
public void ReadAsBytesNoContentWrappedObject()
1335
JsonTextReader reader = new JsonTextReader(new StringReader(@"{"));
1337
ExceptionAssert.Throws<JsonReaderException>(
1338
"Unexpected end when reading bytes. Path '', line 1, position 1.",
1341
reader.ReadAsBytes();
1347
public void ReadAsDateTimeOffsetNoContent()
1349
JsonTextReader reader = new JsonTextReader(new StringReader(@""));
1351
Assert.IsNull(reader.ReadAsDateTimeOffset());
1352
Assert.AreEqual(JsonToken.None, reader.TokenType);
1357
public void ReadAsDecimalBadContent()
1359
JsonTextReader reader = new JsonTextReader(new StringReader(@"new Date()"));
1361
ExceptionAssert.Throws<JsonReaderException>(
1362
"Error reading decimal. Unexpected token: StartConstructor. Path '', line 1, position 9.",
1365
reader.ReadAsDecimal();
1370
public void ReadAsBytesBadContent()
1372
JsonTextReader reader = new JsonTextReader(new StringReader(@"new Date()"));
1374
ExceptionAssert.Throws<JsonReaderException>(
1375
"Error reading bytes. Unexpected token: StartConstructor. Path '', line 1, position 9.",
1378
reader.ReadAsBytes();
1384
public void ReadAsDateTimeOffsetBadContent()
1386
JsonTextReader reader = new JsonTextReader(new StringReader(@"new Date()"));
1388
ExceptionAssert.Throws<JsonReaderException>(
1389
"Error reading date. Unexpected token: StartConstructor. Path '', line 1, position 9.",
1392
reader.ReadAsDateTimeOffset();
1398
public void ReadAsBytesIntegerArrayWithComments()
1400
JsonTextReader reader = new JsonTextReader(new StringReader(@"[/*hi*/1/*hi*/,2/*hi*/]"));
1402
byte[] data = reader.ReadAsBytes();
1403
Assert.AreEqual(2, data.Length);
1404
Assert.AreEqual(1, data[0]);
1405
Assert.AreEqual(2, data[1]);
1409
public void ReadAsBytesIntegerArrayWithNoEnd()
1411
JsonTextReader reader = new JsonTextReader(new StringReader(@"[1"));
1413
ExceptionAssert.Throws<JsonReaderException>(
1414
"Unexpected end when reading bytes. Path '[0]', line 1, position 2.",
1417
reader.ReadAsBytes();
1422
public void ReadAsBytesArrayWithBadContent()
1424
JsonTextReader reader = new JsonTextReader(new StringReader(@"[1.0]"));
1426
ExceptionAssert.Throws<JsonReaderException>(
1427
"Unexpected token when reading bytes: Float. Path '[0]', line 1, position 4.",
1430
reader.ReadAsBytes();
1435
public void ReadUnicode()
1437
string json = @"{""Message"":""Hi,I\u0092ve send you smth""}";
1439
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1440
reader.SetCharBuffer(new char[5]);
1442
Assert.IsTrue(reader.Read());
1443
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1445
Assert.IsTrue(reader.Read());
1446
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1447
Assert.AreEqual("Message", reader.Value);
1449
Assert.IsTrue(reader.Read());
1450
Assert.AreEqual(JsonToken.String, reader.TokenType);
1451
Assert.AreEqual(@"Hi,I" + '\u0092' + "ve send you smth", reader.Value);
1453
Assert.IsTrue(reader.Read());
1454
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1456
Assert.IsFalse(reader.Read());
1460
public void ReadHexidecimalWithAllLetters()
1462
string json = @"{""text"":0xabcdef12345}";
1464
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1466
Assert.IsTrue(reader.Read());
1467
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1469
Assert.IsTrue(reader.Read());
1470
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1472
Assert.IsTrue(reader.Read());
1473
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
1474
Assert.AreEqual(11806310474565, reader.Value);
1476
Assert.IsTrue(reader.Read());
1477
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1482
public void ReadAsDateTimeOffset()
1484
string json = "{\"Offset\":\"\\/Date(946663200000+0600)\\/\"}";
1486
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1488
Assert.IsTrue(reader.Read());
1489
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1491
Assert.IsTrue(reader.Read());
1492
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1494
reader.ReadAsDateTimeOffset();
1495
Assert.AreEqual(JsonToken.Date, reader.TokenType);
1496
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
1497
Assert.AreEqual(new DateTimeOffset(new DateTime(2000, 1, 1), TimeSpan.FromHours(6)), reader.Value);
1499
Assert.IsTrue(reader.Read());
1500
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1504
public void ReadAsDateTimeOffsetNegative()
1506
string json = @"{""Offset"":""\/Date(946706400000-0600)\/""}";
1508
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1510
Assert.IsTrue(reader.Read());
1511
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1513
Assert.IsTrue(reader.Read());
1514
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1516
reader.ReadAsDateTimeOffset();
1517
Assert.AreEqual(JsonToken.Date, reader.TokenType);
1518
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
1519
Assert.AreEqual(new DateTimeOffset(new DateTime(2000, 1, 1), TimeSpan.FromHours(-6)), reader.Value);
1521
Assert.IsTrue(reader.Read());
1522
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1526
public void ReadAsDateTimeOffsetBadString()
1528
string json = @"{""Offset"":""blablahbla""}";
1530
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1532
Assert.IsTrue(reader.Read());
1533
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1535
Assert.IsTrue(reader.Read());
1536
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1538
ExceptionAssert.Throws<JsonReaderException>(
1539
"Could not convert string to DateTimeOffset: blablahbla. Path 'Offset', line 1, position 22.",
1542
reader.ReadAsDateTimeOffset();
1547
public void ReadAsDateTimeOffsetHoursOnly()
1549
string json = "{\"Offset\":\"\\/Date(946663200000+06)\\/\"}";
1551
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1553
Assert.IsTrue(reader.Read());
1554
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1556
Assert.IsTrue(reader.Read());
1557
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1559
reader.ReadAsDateTimeOffset();
1560
Assert.AreEqual(JsonToken.Date, reader.TokenType);
1561
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
1562
Assert.AreEqual(new DateTimeOffset(new DateTime(2000, 1, 1), TimeSpan.FromHours(6)), reader.Value);
1564
Assert.IsTrue(reader.Read());
1565
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1569
public void ReadAsDateTimeOffsetWithMinutes()
1571
string json = @"{""Offset"":""\/Date(946708260000-0631)\/""}";
1573
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1575
Assert.IsTrue(reader.Read());
1576
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1578
Assert.IsTrue(reader.Read());
1579
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1581
reader.ReadAsDateTimeOffset();
1582
Assert.AreEqual(JsonToken.Date, reader.TokenType);
1583
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
1584
Assert.AreEqual(new DateTimeOffset(new DateTime(2000, 1, 1), TimeSpan.FromHours(-6).Add(TimeSpan.FromMinutes(-31))), reader.Value);
1586
Assert.IsTrue(reader.Read());
1587
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1591
public void ReadAsDateTimeOffsetIsoDate()
1593
string json = @"{""Offset"":""2011-08-01T21:25Z""}";
1595
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1597
Assert.IsTrue(reader.Read());
1598
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1600
Assert.IsTrue(reader.Read());
1601
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1603
reader.ReadAsDateTimeOffset();
1604
Assert.AreEqual(JsonToken.Date, reader.TokenType);
1605
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
1606
Assert.AreEqual(new DateTimeOffset(new DateTime(2011, 8, 1, 21, 25, 0, DateTimeKind.Utc), TimeSpan.Zero), reader.Value);
1608
Assert.IsTrue(reader.Read());
1609
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1613
public void ReadAsDateTimeOffsetUnitedStatesDate()
1615
string json = @"{""Offset"":""1/30/2011""}";
1617
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1618
reader.Culture = new CultureInfo("en-US");
1620
Assert.IsTrue(reader.Read());
1621
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1623
Assert.IsTrue(reader.Read());
1624
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1626
reader.ReadAsDateTimeOffset();
1627
Assert.AreEqual(JsonToken.Date, reader.TokenType);
1628
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
1630
DateTimeOffset dt = (DateTimeOffset)reader.Value;
1631
Assert.AreEqual(new DateTime(2011, 1, 30, 0, 0, 0, DateTimeKind.Unspecified), dt.DateTime);
1633
Assert.IsTrue(reader.Read());
1634
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1638
public void ReadAsDateTimeOffsetNewZealandDate()
1640
string json = @"{""Offset"":""30/1/2011""}";
1642
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1643
reader.Culture = new CultureInfo("en-NZ");
1645
Assert.IsTrue(reader.Read());
1646
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1648
Assert.IsTrue(reader.Read());
1649
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1651
reader.ReadAsDateTimeOffset();
1652
Assert.AreEqual(JsonToken.Date, reader.TokenType);
1653
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
1655
DateTimeOffset dt = (DateTimeOffset)reader.Value;
1656
Assert.AreEqual(new DateTime(2011, 1, 30, 0, 0, 0, DateTimeKind.Unspecified), dt.DateTime);
1658
Assert.IsTrue(reader.Read());
1659
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1664
public void ReadAsDecimalInt()
1666
string json = @"{""Name"":1}";
1668
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1670
Assert.IsTrue(reader.Read());
1671
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1673
Assert.IsTrue(reader.Read());
1674
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1676
reader.ReadAsDecimal();
1677
Assert.AreEqual(JsonToken.Float, reader.TokenType);
1678
Assert.AreEqual(typeof(decimal), reader.ValueType);
1679
Assert.AreEqual(1m, reader.Value);
1683
public void ReadAsIntDecimal()
1685
string json = @"{""Name"": 1.1}";
1687
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1689
Assert.IsTrue(reader.Read());
1690
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1692
Assert.IsTrue(reader.Read());
1693
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1695
ExceptionAssert.Throws<FormatException>(
1696
"Input string was not in a correct format.",
1699
reader.ReadAsInt32();
1704
public void MatchWithInsufficentCharacters()
1706
JsonTextReader reader = new JsonTextReader(new StringReader(@"nul"));
1708
ExceptionAssert.Throws<JsonReaderException>(
1709
"Error parsing null value. Path '', line 0, position 0.",
1717
public void MatchWithWrongCharacters()
1719
JsonTextReader reader = new JsonTextReader(new StringReader(@"nulz"));
1721
ExceptionAssert.Throws<JsonReaderException>(
1722
"Error parsing null value. Path '', line 0, position 0.",
1730
public void MatchWithNoTrailingSeperator()
1732
JsonTextReader reader = new JsonTextReader(new StringReader(@"nullz"));
1734
ExceptionAssert.Throws<JsonReaderException>(
1735
"Error parsing null value. Path '', line 1, position 4.",
1743
public void UnclosedComment()
1745
JsonTextReader reader = new JsonTextReader(new StringReader(@"/* sdf"));
1747
ExceptionAssert.Throws<JsonReaderException>(
1748
"Unexpected end while parsing comment. Path '', line 1, position 6.",
1756
public void BadCommentStart()
1758
JsonTextReader reader = new JsonTextReader(new StringReader(@"/sdf"));
1760
ExceptionAssert.Throws<JsonReaderException>(
1761
"Error parsing comment. Expected: *, got s. Path '', line 1, position 1.",
1769
public void ReadAsDecimal()
1771
string json = @"{""decimal"":-7.92281625142643E+28}";
1773
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1775
Assert.IsTrue(reader.Read());
1776
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1778
Assert.IsTrue(reader.Read());
1779
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1781
decimal? d = reader.ReadAsDecimal();
1782
Assert.AreEqual(JsonToken.Float, reader.TokenType);
1783
Assert.AreEqual(typeof(decimal), reader.ValueType);
1784
Assert.AreEqual(-79228162514264300000000000000m, d);
1786
Assert.IsTrue(reader.Read());
1787
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1791
public void ReadAsDecimalFrench()
1793
string json = @"{""decimal"":""9,99""}";
1795
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1796
reader.Culture = new CultureInfo("fr-FR");
1798
Assert.IsTrue(reader.Read());
1799
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1801
Assert.IsTrue(reader.Read());
1802
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1804
decimal? d = reader.ReadAsDecimal();
1805
Assert.AreEqual(JsonToken.Float, reader.TokenType);
1806
Assert.AreEqual(typeof(decimal), reader.ValueType);
1807
Assert.AreEqual(9.99m, d);
1809
Assert.IsTrue(reader.Read());
1810
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1814
public void ReadBufferOnControlChar()
1819
""BirthDate"": ""\/Date(978048000000)\/"",
1820
""LastModified"": ""\/Date(978048000000)\/""
1824
""BirthDate"": ""\/Date(978048000000)\/"",
1825
""LastModified"": ""\/Date(978048000000)\/""
1829
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1830
reader.SetCharBuffer(new char[5]);
1831
for (int i = 0; i < 13; i++)
1836
Assert.IsTrue(reader.Read());
1837
Assert.AreEqual(new DateTime(631136448000000000), reader.Value);
1841
public void ReadBufferOnEndComment()
1843
string json = @"/*comment*/ { /*comment*/
1844
""Name"": /*comment*/ ""Apple"" /*comment*/, /*comment*/
1845
""ExpiryDate"": ""\/Date(1230422400000)\/"",
1847
""Sizes"": /*comment*/ [ /*comment*/
1848
""Small"", /*comment*/
1849
""Medium"" /*comment*/,
1850
/*comment*/ ""Large""
1851
/*comment*/ ] /*comment*/
1854
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1855
reader.SetCharBuffer(new char[5]);
1857
for (int i = 0; i < 26; i++)
1859
Assert.IsTrue(reader.Read());
1862
Assert.IsTrue(reader.Read());
1863
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
1865
Assert.IsFalse(reader.Read());
1869
public void ParseNullStringConstructor()
1871
string json = "new Date\0()";
1872
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1873
reader.SetCharBuffer(new char[7]);
1875
Assert.IsTrue(reader.Read());
1876
Assert.AreEqual("Date", reader.Value);
1877
Assert.AreEqual(JsonToken.StartConstructor, reader.TokenType);
1879
Assert.IsTrue(reader.Read());
1880
Assert.AreEqual(JsonToken.EndConstructor, reader.TokenType);
1884
public void ParseLineFeedDelimitedConstructor()
1886
string json = "new Date\n()";
1887
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1889
Assert.IsTrue(reader.Read());
1890
Assert.AreEqual("Date", reader.Value);
1891
Assert.AreEqual(JsonToken.StartConstructor, reader.TokenType);
1893
Assert.IsTrue(reader.Read());
1894
Assert.AreEqual(JsonToken.EndConstructor, reader.TokenType);
1898
public void ParseArrayWithMissingValues()
1900
string json = "[,,, \n\r\n \0 \r , , ]";
1901
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1903
Assert.IsTrue(reader.Read());
1904
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
1906
Assert.IsTrue(reader.Read());
1907
Assert.AreEqual(JsonToken.Undefined, reader.TokenType);
1909
Assert.IsTrue(reader.Read());
1910
Assert.AreEqual(JsonToken.Undefined, reader.TokenType);
1912
Assert.IsTrue(reader.Read());
1913
Assert.AreEqual(JsonToken.Undefined, reader.TokenType);
1915
Assert.IsTrue(reader.Read());
1916
Assert.AreEqual(JsonToken.Undefined, reader.TokenType);
1918
Assert.IsTrue(reader.Read());
1919
Assert.AreEqual(JsonToken.Undefined, reader.TokenType);
1921
Assert.IsTrue(reader.Read());
1922
Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
1926
public void ParseBooleanWithNoExtraContent()
1928
string json = "[true ";
1929
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1931
Assert.IsTrue(reader.Read());
1932
Assert.IsTrue(reader.Read());
1933
Assert.IsFalse(reader.Read());
1937
public void ParseConstructorWithUnexpectedEnd()
1939
string json = "new Dat";
1940
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1942
ExceptionAssert.Throws<JsonReaderException>(
1943
"Unexpected end while parsing constructor. Path '', line 1, position 7.",
1951
public void ParseConstructorWithUnexpectedCharacter()
1953
string json = "new Date !";
1954
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1956
ExceptionAssert.Throws<JsonReaderException>(
1957
"Unexpected character while parsing constructor: !. Path '', line 1, position 9.",
1965
public void ParseObjectWithNoEnd()
1967
string json = "{hi:1, ";
1968
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1970
Assert.IsTrue(reader.Read());
1971
Assert.IsTrue(reader.Read());
1972
Assert.IsTrue(reader.Read());
1973
Assert.IsFalse(reader.Read());
1977
public void ParseEmptyArray()
1980
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1982
Assert.IsTrue(reader.Read());
1983
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
1985
Assert.IsTrue(reader.Read());
1986
Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
1990
public void ParseEmptyObject()
1993
JsonTextReader reader = new JsonTextReader(new StringReader(json));
1995
Assert.IsTrue(reader.Read());
1996
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1998
Assert.IsTrue(reader.Read());
1999
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
2003
public void ParseIncompleteCommentSeperator()
2005
JsonTextReader reader = new JsonTextReader(new StringReader("true/"));
2007
ExceptionAssert.Throws<JsonReaderException>(
2008
"Error parsing boolean value. Path '', line 1, position 4.",
2016
public void ParseEmptyConstructor()
2018
string json = "new Date()";
2019
JsonTextReader reader = new JsonTextReader(new StringReader(json));
2021
Assert.IsTrue(reader.Read());
2022
Assert.AreEqual(JsonToken.StartConstructor, reader.TokenType);
2024
Assert.IsTrue(reader.Read());
2025
Assert.AreEqual(JsonToken.EndConstructor, reader.TokenType);
2029
public void ParseConstructorWithBadCharacter()
2031
string json = "new Date,()";
2032
JsonTextReader reader = new JsonTextReader(new StringReader(json));
2034
ExceptionAssert.Throws<JsonReaderException>(
2035
"Unexpected character while parsing constructor: ,. Path '', line 1, position 8.",
2038
Assert.IsTrue(reader.Read());
2043
public void ParseContentDelimitedByNonStandardWhitespace()
2045
string json = "\x00a0{\x00a0'h\x00a0i\x00a0'\x00a0:\x00a0[\x00a0true\x00a0,\x00a0new\x00a0Date\x00a0(\x00a0)\x00a0]\x00a0/*\x00a0comment\x00a0*/\x00a0}\x00a0";
2046
JsonTextReader reader = new JsonTextReader(new StreamReader(new SlowStream(json, new UTF8Encoding(false), 1)));
2048
Assert.IsTrue(reader.Read());
2049
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
2051
Assert.IsTrue(reader.Read());
2052
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
2054
Assert.IsTrue(reader.Read());
2055
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
2057
Assert.IsTrue(reader.Read());
2058
Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
2060
Assert.IsTrue(reader.Read());
2061
Assert.AreEqual(JsonToken.StartConstructor, reader.TokenType);
2063
Assert.IsTrue(reader.Read());
2064
Assert.AreEqual(JsonToken.EndConstructor, reader.TokenType);
2066
Assert.IsTrue(reader.Read());
2067
Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
2069
Assert.IsTrue(reader.Read());
2070
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
2072
Assert.IsTrue(reader.Read());
2073
Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
2075
Assert.IsFalse(reader.Read());
2079
public void ReadContentDelimitedByComments()
2081
string json = @"/*comment*/{/*comment*/Name:/*comment*/true/*comment*/,/*comment*/
2082
""ExpiryDate"":/*comment*/new
2083
" + StringUtils.LineFeed +
2085
(/*comment*/null/*comment*/),
2087
""Sizes"":/*comment*/[/*comment*/
2088
""Small""/*comment*/]/*comment*/}/*comment*/";
2090
JsonTextReader reader = new JsonTextReader(new StreamReader(new SlowStream(json, new UTF8Encoding(false), 1)));
2092
Assert.IsTrue(reader.Read());
2093
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
2095
Assert.IsTrue(reader.Read());
2096
Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
2098
Assert.IsTrue(reader.Read());
2099
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
2101
Assert.IsTrue(reader.Read());
2102
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
2103
Assert.AreEqual("Name", reader.Value);
2105
Assert.IsTrue(reader.Read());
2106
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
2108
Assert.IsTrue(reader.Read());
2109
Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
2110
Assert.AreEqual(true, reader.Value);
2112
Assert.IsTrue(reader.Read());
2113
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
2115
Assert.IsTrue(reader.Read());
2116
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
2118
Assert.IsTrue(reader.Read());
2119
Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
2120
Assert.AreEqual("ExpiryDate", reader.Value);
2122
Assert.IsTrue(reader.Read());
2123
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
2125
Assert.IsTrue(reader.Read());
2126
Assert.AreEqual(JsonToken.StartConstructor, reader.TokenType);
2127
Assert.AreEqual(5, reader.LineNumber);
2128
Assert.AreEqual("Date", reader.Value);
2130
Assert.IsTrue(reader.Read());
2131
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
2133
Assert.IsTrue(reader.Read());
2134
Assert.AreEqual(JsonToken.Null, reader.TokenType);
2136
Assert.IsTrue(reader.Read());
2137
Assert.AreEqual(JsonToken.Comment, reader.TokenType);
2139
Assert.IsTrue(reader.Read());
2140
Assert.AreEqual(JsonToken.EndConstructor, reader.TokenType);
2144
public void ParseOctalNumber()
2146
string json = @"010";
2148
JsonTextReader reader = new JsonTextReader(new StringReader(json));
2150
reader.ReadAsDecimal();
2151
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2152
Assert.AreEqual(8m, reader.Value);
2156
public void ParseHexNumber()
2158
string json = @"0x20";
2160
JsonTextReader reader = new JsonTextReader(new StringReader(json));
2162
reader.ReadAsDecimal();
2163
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2164
Assert.AreEqual(32m, reader.Value);
2168
public void ParseNumbers()
2170
string json = @"[0,1,2 , 3]";
2172
JsonTextReader reader = new JsonTextReader(new StringReader(json));
2175
Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
2178
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
2181
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
2184
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
2187
Assert.AreEqual(JsonToken.Integer, reader.TokenType);
2190
Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
2194
public void UnexpectedEndTokenWhenParsingOddEndToken()
2196
JsonReader reader = new JsonTextReader(new StringReader(@"{}}"));
2197
Assert.IsTrue(reader.Read());
2198
Assert.IsTrue(reader.Read());
2200
ExceptionAssert.Throws<JsonReaderException>(
2201
"Additional text encountered after finished reading JSON content: }. Path '', line 1, position 2.",
2209
public void ScientificNotation()
2213
d = Convert.ToDouble("6.0221418e23", CultureInfo.InvariantCulture);
2214
Console.WriteLine(d.ToString(new CultureInfo("fr-FR")));
2215
Console.WriteLine(d.ToString("0.#############################################################################"));
2217
//CultureInfo info = CultureInfo.GetCultureInfo("fr-FR");
2218
//Console.WriteLine(info.NumberFormat.NumberDecimalSeparator);
2220
string json = @"[0e-10,0E-10,0.25e-5,0.3e10,6.0221418e23]";
2222
JsonTextReader reader = new JsonTextReader(new StringReader(json));
2227
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2228
Assert.AreEqual(0d, reader.Value);
2231
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2232
Assert.AreEqual(0d, reader.Value);
2235
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2236
Assert.AreEqual(0.0000025d, reader.Value);
2239
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2240
Assert.AreEqual(3000000000d, reader.Value);
2243
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2244
Assert.AreEqual(602214180000000000000000d, reader.Value);
2249
reader = new JsonTextReader(new StringReader(json));
2253
reader.ReadAsDecimal();
2254
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2255
Assert.AreEqual(0m, reader.Value);
2257
reader.ReadAsDecimal();
2258
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2259
Assert.AreEqual(0m, reader.Value);
2261
reader.ReadAsDecimal();
2262
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2263
Assert.AreEqual(0.0000025m, reader.Value);
2265
reader.ReadAsDecimal();
2266
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2267
Assert.AreEqual(3000000000m, reader.Value);
2269
reader.ReadAsDecimal();
2270
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2271
Assert.AreEqual(602214180000000000000000m, reader.Value);
2277
public void MaxDepth()
2279
string json = "[[]]";
2281
JsonTextReader reader = new JsonTextReader(new StringReader(json))
2286
Assert.IsTrue(reader.Read());
2288
ExceptionAssert.Throws<JsonReaderException>(
2289
"The reader's MaxDepth of 1 has been exceeded. Path '[0]', line 1, position 2.",
2292
Assert.IsTrue(reader.Read());
2297
public void MaxDepthDoesNotRecursivelyError()
2299
string json = "[[[[]]],[[]]]";
2301
JsonTextReader reader = new JsonTextReader(new StringReader(json))
2306
Assert.IsTrue(reader.Read());
2307
Assert.AreEqual(0, reader.Depth);
2309
ExceptionAssert.Throws<JsonReaderException>(
2310
"The reader's MaxDepth of 1 has been exceeded. Path '[0]', line 1, position 2.",
2313
Assert.IsTrue(reader.Read());
2315
Assert.AreEqual(1, reader.Depth);
2317
Assert.IsTrue(reader.Read());
2318
Assert.AreEqual(2, reader.Depth);
2320
Assert.IsTrue(reader.Read());
2321
Assert.AreEqual(3, reader.Depth);
2323
Assert.IsTrue(reader.Read());
2324
Assert.AreEqual(3, reader.Depth);
2326
Assert.IsTrue(reader.Read());
2327
Assert.AreEqual(2, reader.Depth);
2329
Assert.IsTrue(reader.Read());
2330
Assert.AreEqual(1, reader.Depth);
2332
ExceptionAssert.Throws<JsonReaderException>(
2333
"The reader's MaxDepth of 1 has been exceeded. Path '[1]', line 1, position 9.",
2336
Assert.IsTrue(reader.Read());
2338
Assert.AreEqual(1, reader.Depth);
2340
Assert.IsTrue(reader.Read());
2341
Assert.AreEqual(2, reader.Depth);
2343
Assert.IsTrue(reader.Read());
2344
Assert.AreEqual(2, reader.Depth);
2346
Assert.IsTrue(reader.Read());
2347
Assert.AreEqual(1, reader.Depth);
2349
Assert.IsTrue(reader.Read());
2350
Assert.AreEqual(0, reader.Depth);
2352
Assert.IsFalse(reader.Read());
2356
public void ReadingFromSlowStream()
2358
string json = "[false, true, true, false, 'test!', 1.11, 0e-10, 0E-10, 0.25e-5, 0.3e10, 6.0221418e23, 'Purple\\r \\n monkey\\'s:\\tdishwasher']";
2360
JsonTextReader reader = new JsonTextReader(new StreamReader(new SlowStream(json, new UTF8Encoding(false), 1)));
2362
Assert.IsTrue(reader.Read());
2364
Assert.IsTrue(reader.Read());
2365
Assert.AreEqual(false, reader.Value);
2367
Assert.IsTrue(reader.Read());
2368
Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
2369
Assert.AreEqual(true, reader.Value);
2371
Assert.IsTrue(reader.Read());
2372
Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
2373
Assert.AreEqual(true, reader.Value);
2375
Assert.IsTrue(reader.Read());
2376
Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
2377
Assert.AreEqual(false, reader.Value);
2379
Assert.IsTrue(reader.Read());
2380
Assert.AreEqual(JsonToken.String, reader.TokenType);
2381
Assert.AreEqual("test!", reader.Value);
2383
Assert.IsTrue(reader.Read());
2384
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2385
Assert.AreEqual(1.11d, reader.Value);
2387
Assert.IsTrue(reader.Read());
2388
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2389
Assert.AreEqual(0d, reader.Value);
2391
Assert.IsTrue(reader.Read());
2392
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2393
Assert.AreEqual(0d, reader.Value);
2395
Assert.IsTrue(reader.Read());
2396
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2397
Assert.AreEqual(0.0000025d, reader.Value);
2399
Assert.IsTrue(reader.Read());
2400
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2401
Assert.AreEqual(3000000000d, reader.Value);
2403
Assert.IsTrue(reader.Read());
2404
Assert.AreEqual(JsonToken.Float, reader.TokenType);
2405
Assert.AreEqual(602214180000000000000000d, reader.Value);
2407
Assert.IsTrue(reader.Read());
2408
Assert.AreEqual(JsonToken.String, reader.TokenType);
2409
Assert.AreEqual(reader.Value, "Purple\r \n monkey's:\tdishwasher");
2411
Assert.IsTrue(reader.Read());
2415
public void DateParseHandling()
2417
string json = @"[""1970-01-01T00:00:00Z"",""\/Date(0)\/""]";
2419
JsonTextReader reader = new JsonTextReader(new StringReader(json));
2420
reader.DateParseHandling = Json.DateParseHandling.DateTime;
2422
Assert.IsTrue(reader.Read());
2423
Assert.IsTrue(reader.Read());
2424
Assert.AreEqual(new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
2425
Assert.AreEqual(typeof(DateTime), reader.ValueType);
2426
Assert.IsTrue(reader.Read());
2427
Assert.AreEqual(new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
2428
Assert.AreEqual(typeof(DateTime), reader.ValueType);
2429
Assert.IsTrue(reader.Read());
2432
reader = new JsonTextReader(new StringReader(json));
2433
reader.DateParseHandling = Json.DateParseHandling.DateTimeOffset;
2435
Assert.IsTrue(reader.Read());
2436
Assert.IsTrue(reader.Read());
2437
Assert.AreEqual(new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
2438
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
2439
Assert.IsTrue(reader.Read());
2440
Assert.AreEqual(new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
2441
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
2442
Assert.IsTrue(reader.Read());
2445
reader = new JsonTextReader(new StringReader(json));
2446
reader.DateParseHandling = Json.DateParseHandling.None;
2448
Assert.IsTrue(reader.Read());
2449
Assert.IsTrue(reader.Read());
2450
Assert.AreEqual(@"1970-01-01T00:00:00Z", reader.Value);
2451
Assert.AreEqual(typeof(string), reader.ValueType);
2452
Assert.IsTrue(reader.Read());
2453
Assert.AreEqual(@"/Date(0)/", reader.Value);
2454
Assert.AreEqual(typeof(string), reader.ValueType);
2455
Assert.IsTrue(reader.Read());
2458
reader = new JsonTextReader(new StringReader(json));
2459
reader.DateParseHandling = Json.DateParseHandling.DateTime;
2461
Assert.IsTrue(reader.Read());
2462
reader.ReadAsDateTimeOffset();
2463
Assert.AreEqual(new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
2464
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
2465
reader.ReadAsDateTimeOffset();
2466
Assert.AreEqual(new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero), reader.Value);
2467
Assert.AreEqual(typeof(DateTimeOffset), reader.ValueType);
2468
Assert.IsTrue(reader.Read());
2471
reader = new JsonTextReader(new StringReader(json));
2472
reader.DateParseHandling = Json.DateParseHandling.DateTimeOffset;
2474
Assert.IsTrue(reader.Read());
2475
reader.ReadAsDateTime();
2476
Assert.AreEqual(new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
2477
Assert.AreEqual(typeof(DateTime), reader.ValueType);
2478
reader.ReadAsDateTime();
2479
Assert.AreEqual(new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc), reader.Value);
2480
Assert.AreEqual(typeof(DateTime), reader.ValueType);
2481
Assert.IsTrue(reader.Read());
2486
public void ResetJsonTextReaderErrorCount()
2488
ToggleReaderError toggleReaderError = new ToggleReaderError(new StringReader("{'first':1,'second':2,'third':3}"));
2489
JsonTextReader jsonTextReader = new JsonTextReader(toggleReaderError);
2491
Assert.IsTrue(jsonTextReader.Read());
2493
toggleReaderError.Error = true;
2495
ExceptionAssert.Throws<Exception>(
2497
() => jsonTextReader.Read());
2498
ExceptionAssert.Throws<Exception>(
2500
() => jsonTextReader.Read());
2502
toggleReaderError.Error = false;
2504
Assert.IsTrue(jsonTextReader.Read());
2505
Assert.AreEqual("first", jsonTextReader.Value);
2507
toggleReaderError.Error = true;
2509
ExceptionAssert.Throws<Exception>(
2511
() => jsonTextReader.Read());
2513
toggleReaderError.Error = false;
2515
Assert.IsTrue(jsonTextReader.Read());
2516
Assert.AreEqual(1L, jsonTextReader.Value);
2518
toggleReaderError.Error = true;
2520
ExceptionAssert.Throws<Exception>(
2522
() => jsonTextReader.Read());
2523
ExceptionAssert.Throws<Exception>(
2525
() => jsonTextReader.Read());
2526
ExceptionAssert.Throws<Exception>(
2528
() => jsonTextReader.Read());
2530
toggleReaderError.Error = false;
2532
//a reader use to skip to the end after 3 errors in a row
2533
//Assert.IsFalse(jsonTextReader.Read());
2537
public void WriteReadBoundaryDecimals()
2539
StringWriter sw = new StringWriter();
2540
JsonTextWriter writer = new JsonTextWriter(sw);
2542
writer.WriteStartArray();
2543
writer.WriteValue(decimal.MaxValue);
2544
writer.WriteValue(decimal.MinValue);
2545
writer.WriteEndArray();
2547
string json = sw.ToString();
2549
StringReader sr = new StringReader(json);
2550
JsonTextReader reader = new JsonTextReader(sr);
2552
Assert.IsTrue(reader.Read());
2554
decimal? max = reader.ReadAsDecimal();
2555
Assert.AreEqual(decimal.MaxValue, max);
2557
decimal? min = reader.ReadAsDecimal();
2558
Assert.AreEqual(decimal.MinValue, min);
2560
Assert.IsTrue(reader.Read());
2564
public class ToggleReaderError : TextReader
2566
private readonly TextReader _inner;
2568
public bool Error { get; set; }
2570
public ToggleReaderError(TextReader inner)
2575
public override int Read(char[] buffer, int index, int count)
2578
throw new Exception("Read error");
2580
return _inner.Read(buffer, index, 1);
2584
public class SlowStream : Stream
2590
public SlowStream(byte[] content, int bytesPerRead)
2592
this.bytes = content;
2593
this.totalBytesRead = 0;
2594
this.bytesPerRead = bytesPerRead;
2597
public SlowStream(string content, Encoding encoding, int bytesPerRead)
2598
: this(encoding.GetBytes(content), bytesPerRead)
2602
public override bool CanRead
2604
get { return true; }
2607
public override bool CanSeek
2609
get { return false; }
2612
public override bool CanWrite
2614
get { return false; }
2617
public override void Flush()
2621
public override long Length
2623
get { throw new NotSupportedException(); }
2626
public override long Position
2628
get { throw new NotSupportedException(); }
2629
set { throw new NotSupportedException(); }
2632
public override int Read(byte[] buffer, int offset, int count)
2634
int toReturn = Math.Min(count, this.bytesPerRead);
2635
toReturn = Math.Min(toReturn, this.bytes.Length - this.totalBytesRead);
2638
Array.Copy(this.bytes, this.totalBytesRead, buffer, offset, toReturn);
2641
this.totalBytesRead += toReturn;
2645
public override long Seek(long offset, SeekOrigin origin)
2647
throw new NotSupportedException();
2650
public override void SetLength(long value)
2652
throw new NotSupportedException();
2655
public override void Write(byte[] buffer, int offset, int count)
2657
throw new NotSupportedException();