-Fixed JTokenWriter error with duplicate properties

This commit is contained in:
James Newton-King
2015-08-16 22:48:45 +12:00
parent ec23e08178
commit 6b02abe20c
4 changed files with 37 additions and 8 deletions
@@ -265,6 +265,28 @@ namespace Newtonsoft.Json.Tests.Linq
]", writer.Token.ToString());
}
[Test]
public void WriteDuplicatePropertyName()
{
JTokenWriter writer = new JTokenWriter();
writer.WriteStartObject();
writer.WritePropertyName("prop1");
writer.WriteStartObject();
writer.WriteEndObject();
writer.WritePropertyName("prop1");
writer.WriteStartArray();
writer.WriteEndArray();
writer.WriteEndObject();
StringAssert.AreEqual(@"{
""prop1"": []
}", writer.Token.ToString());
}
[Test]
public void DateTimeZoneHandling()
{
@@ -8630,11 +8630,11 @@ Path '', line 1, position 1.");
[Test]
public void DuplicatePropertiesInNestedObject()
{
ExceptionAssert.Throws<ArgumentException>(() =>
{
string content = @"{""result"":{""time"":1408188592,""time"":1408188593},""error"":null,""id"":""1""}";
JsonConvert.DeserializeObject<JObject>(content);
}, "Can not add property time to Newtonsoft.Json.Linq.JObject. Property with the same name already exists on object.");
string content = @"{""result"":{""time"":1408188592,""time"":1408188593},""error"":null,""id"":""1""}";
JObject o = JsonConvert.DeserializeObject<JObject>(content);
int time = (int)o["result"]["time"];
Assert.AreEqual(1408188593, time);
}
[Test]
+9 -1
View File
@@ -166,9 +166,17 @@ namespace Newtonsoft.Json.Linq
/// <param name="name">The name of the property.</param>
public override void WritePropertyName(string name)
{
JObject o = _parent as JObject;
if (o != null)
{
// avoid duplicate property name exception
// last property name wins
o.Remove(name);
}
AddParent(new JProperty(name));
// don't set state until after in case of an error such as duplicate property names
// don't set state until after in case of an error
// incorrect state will cause issues if writer is disposed when closing open properties
base.WritePropertyName(name);
}
+1 -2
View File
@@ -3,7 +3,6 @@
<packageSources>
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
<clear />
<add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="nuget.org/api/v2" value="https://nuget.org/api/v2/" />
<add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
</packageSources>
</configuration>