From 6aed848eca0bb7ee8612495c203dc44a71e0f12a Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 1 Jul 2017 16:43:15 +1200 Subject: [PATCH] -Added support for reading multiple comma delimited values with JsonReader.SupportMultipleContent --- .../JsonTextReaderTests/MiscAsyncTests.cs | 53 +++++++++++++++++++ .../JsonTextReaderTests/MiscTests.cs | 53 +++++++++++++++++++ Src/Newtonsoft.Json/JsonReader.cs | 4 +- Src/Newtonsoft.Json/JsonTextReader.Async.cs | 7 +++ Src/Newtonsoft.Json/JsonTextReader.cs | 7 +++ 5 files changed, 122 insertions(+), 2 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTests/MiscAsyncTests.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTests/MiscAsyncTests.cs index 112368ae..16433f60 100644 --- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTests/MiscAsyncTests.cs +++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTests/MiscAsyncTests.cs @@ -48,6 +48,59 @@ namespace Newtonsoft.Json.Tests.JsonTextReaderTests #endif public class MiscAsyncTests : TestFixtureBase { + [Test] + public async Task ReadWithSupportMultipleContentCommaDelimitedAsync() + { + string json = @"{ 'name': 'Admin' },{ 'name': 'Publisher' },1,null,[],,'string'"; + + JsonTextReader reader = new JsonTextReader(new StringReader(json)); + reader.SupportMultipleContent = true; + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.StartObject, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.String, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.EndObject, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.StartObject, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.String, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.EndObject, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.Integer, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.Null, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.StartArray, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.EndArray, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.Undefined, reader.TokenType); + + Assert.IsTrue(await reader.ReadAsync()); + Assert.AreEqual(JsonToken.String, reader.TokenType); + + Assert.IsFalse(await reader.ReadAsync()); + } + [Test] public async Task LineInfoAndNewLinesAsync() { diff --git a/Src/Newtonsoft.Json.Tests/JsonTextReaderTests/MiscTests.cs b/Src/Newtonsoft.Json.Tests/JsonTextReaderTests/MiscTests.cs index 7f72970f..5588ea2b 100644 --- a/Src/Newtonsoft.Json.Tests/JsonTextReaderTests/MiscTests.cs +++ b/Src/Newtonsoft.Json.Tests/JsonTextReaderTests/MiscTests.cs @@ -62,6 +62,59 @@ namespace Newtonsoft.Json.Tests.JsonTextReaderTests #endif public class MiscTests : TestFixtureBase { + [Test] + public void ReadWithSupportMultipleContentCommaDelimited() + { + string json = @"{ 'name': 'Admin' },{ 'name': 'Publisher' },1,null,[],,'string'"; + + JsonTextReader reader = new JsonTextReader(new StringReader(json)); + reader.SupportMultipleContent = true; + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.StartObject, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.String, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.EndObject, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.StartObject, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.PropertyName, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.String, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.EndObject, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.Integer, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.Null, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.StartArray, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.EndArray, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.Undefined, reader.TokenType); + + Assert.IsTrue(reader.Read()); + Assert.AreEqual(JsonToken.String, reader.TokenType); + + Assert.IsFalse(reader.Read()); + } + [Test] public void LineInfoAndNewLines() { diff --git a/Src/Newtonsoft.Json/JsonReader.cs b/Src/Newtonsoft.Json/JsonReader.cs index 95f08757..edc23360 100644 --- a/Src/Newtonsoft.Json/JsonReader.cs +++ b/Src/Newtonsoft.Json/JsonReader.cs @@ -1032,7 +1032,7 @@ namespace Newtonsoft.Json internal void SetPostValueState(bool updateIndex) { - if (Peek() != JsonContainerType.None) + if (Peek() != JsonContainerType.None || SupportMultipleContent) { _currentState = State.PostValue; } @@ -1064,7 +1064,7 @@ namespace Newtonsoft.Json throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, currentObject)); } - if (Peek() != JsonContainerType.None) + if (Peek() != JsonContainerType.None || SupportMultipleContent) { _currentState = State.PostValue; } diff --git a/Src/Newtonsoft.Json/JsonTextReader.Async.cs b/Src/Newtonsoft.Json/JsonTextReader.Async.cs index 2af371ba..51370fd6 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.Async.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.Async.cs @@ -176,6 +176,13 @@ namespace Newtonsoft.Json } else { + // handle multiple content without comma delimiter + if (SupportMultipleContent && Depth == 0) + { + SetStateBasedOnCurrent(); + return false; + } + throw JsonReaderException.Create(this, "After parsing a value an unexpected character was encountered: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); } diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs index 5fafa20d..e85d69f0 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.cs @@ -1458,6 +1458,13 @@ namespace Newtonsoft.Json } else { + // handle multiple content without comma delimiter + if (SupportMultipleContent && Depth == 0) + { + SetStateBasedOnCurrent(); + return false; + } + throw JsonReaderException.Create(this, "After parsing a value an unexpected character was encountered: {0}.".FormatWith(CultureInfo.InvariantCulture, currentChar)); } break;