-Fixed JToken.ReadFrom creating a string value for a comment

This commit is contained in:
James Newton-King
2014-04-28 17:11:02 +12:00
parent 2039a29d91
commit 7458cefe95
3 changed files with 127 additions and 15 deletions
@@ -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()
{
@@ -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<JsonReaderException>(@"Error reading JToken from JsonReader. Unexpected token: EndArray. Path '', line 1, position 2.",
() => JToken.ReadFrom(jsonReader));
}
[Test]
public void JPropertyPath()
{
+35 -15
View File
@@ -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));
}
}
/// <summary>