diff --git a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs index aeead314..33df0d4d 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JObjectTests.cs @@ -57,6 +57,23 @@ namespace Newtonsoft.Json.Tests.Linq [TestFixture] public class JObjectTests : TestFixtureBase { + [Test] + public void EmbedJValueStringInNewJObject() + { + string s = null; + var v = new JValue(s); + dynamic o = JObject.FromObject(new { title = v }); + + string output = o.ToString(); + + Assert.AreEqual(@"{ + ""title"": null +}", output); + + Assert.AreEqual(null, v.Value); + Assert.IsNull((string)o.title); + } + [Test] public void JObjectWithComments() { diff --git a/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs b/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs index ac5000e5..41bd408a 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/LinqToJsonTest.cs @@ -49,6 +49,81 @@ namespace Newtonsoft.Json.Tests.Linq [TestFixture] public class LinqToJsonTest : TestFixtureBase { + [Test] + public void CommentsAndReadFrom() + { + StringReader textReader = new StringReader(@"[ + // hi + 1, + 2, + 3 +]"); + + JsonTextReader jsonReader = new JsonTextReader(textReader); + JArray a = (JArray)JToken.ReadFrom(jsonReader); + + Assert.AreEqual(4, a.Count); + Assert.AreEqual(JTokenType.Comment, a[0].Type); + Assert.AreEqual(" hi", ((JValue)a[0]).Value); + } + + [Test] + public void StartingCommentAndReadFrom() + { + StringReader textReader = new StringReader(@" +// hi +[ + 1, + 2, + 3 +]"); + + JsonTextReader jsonReader = new JsonTextReader(textReader); + JValue v = (JValue)JToken.ReadFrom(jsonReader); + + Assert.AreEqual(JTokenType.Comment, v.Type); + + IJsonLineInfo lineInfo = v; + Assert.AreEqual(true, lineInfo.HasLineInfo()); + Assert.AreEqual(3, lineInfo.LineNumber); + Assert.AreEqual(1, lineInfo.LinePosition); + } + + [Test] + public void StartingUndefinedAndReadFrom() + { + StringReader textReader = new StringReader(@" +undefined +[ + 1, + 2, + 3 +]"); + + JsonTextReader jsonReader = new JsonTextReader(textReader); + JValue v = (JValue)JToken.ReadFrom(jsonReader); + + Assert.AreEqual(JTokenType.Undefined, v.Type); + + IJsonLineInfo lineInfo = v; + Assert.AreEqual(true, lineInfo.HasLineInfo()); + Assert.AreEqual(2, lineInfo.LineNumber); + Assert.AreEqual(10, lineInfo.LinePosition); + } + + [Test] + public void StartingEndArrayAndReadFrom() + { + StringReader textReader = new StringReader(@"[]"); + + JsonTextReader jsonReader = new JsonTextReader(textReader); + jsonReader.Read(); + jsonReader.Read(); + + ExceptionAssert.Throws(@"Error reading JToken from JsonReader. Unexpected token: EndArray. Path '', line 1, position 2.", + () => JToken.ReadFrom(jsonReader)); + } + [Test] public void JPropertyPath() { diff --git a/Src/Newtonsoft.Json/Linq/JToken.cs b/Src/Newtonsoft.Json/Linq/JToken.cs index d7f648ad..b946f888 100644 --- a/Src/Newtonsoft.Json/Linq/JToken.cs +++ b/Src/Newtonsoft.Json/Linq/JToken.cs @@ -1835,22 +1835,42 @@ namespace Newtonsoft.Json.Linq throw JsonReaderException.Create(reader, "Error reading JToken from JsonReader."); } - if (reader.TokenType == JsonToken.StartObject) - return JObject.Load(reader); + IJsonLineInfo lineInfo = reader as IJsonLineInfo; - if (reader.TokenType == JsonToken.StartArray) - return JArray.Load(reader); - - if (reader.TokenType == JsonToken.PropertyName) - return JProperty.Load(reader); - - if (reader.TokenType == JsonToken.StartConstructor) - return JConstructor.Load(reader); - - if (!JsonReader.IsStartToken(reader.TokenType)) - return new JValue(reader.Value); - - throw JsonReaderException.Create(reader, "Error reading JToken from JsonReader. Unexpected token: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + switch (reader.TokenType) + { + case JsonToken.StartObject: + return JObject.Load(reader); + case JsonToken.StartArray: + return JArray.Load(reader); + case JsonToken.StartConstructor: + return JConstructor.Load(reader); + case JsonToken.PropertyName: + return JProperty.Load(reader); + case JsonToken.String: + case JsonToken.Integer: + case JsonToken.Float: + case JsonToken.Date: + case JsonToken.Boolean: + case JsonToken.Bytes: + JValue v = new JValue(reader.Value); + v.SetLineInfo(lineInfo); + return v; + case JsonToken.Comment: + v = JValue.CreateComment(reader.Value.ToString()); + v.SetLineInfo(lineInfo); + return v; + case JsonToken.Null: + v = new JValue(null, JTokenType.Null); + v.SetLineInfo(lineInfo); + return v; + case JsonToken.Undefined: + v = new JValue(null, JTokenType.Undefined); + v.SetLineInfo(lineInfo); + return v; + default: + throw JsonReaderException.Create(reader, "Error reading JToken from JsonReader. Unexpected token: {0}".FormatWith(CultureInfo.InvariantCulture, reader.TokenType)); + } } ///