From 6b02abe20cb078edf412030f611070831067da8d Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sun, 16 Aug 2015 22:48:45 +1200 Subject: [PATCH] -Fixed JTokenWriter error with duplicate properties --- .../Linq/JTokenWriterTest.cs | 22 +++++++++++++++++++ .../Serialization/JsonSerializerTest.cs | 10 ++++----- Src/Newtonsoft.Json/Linq/JTokenWriter.cs | 10 ++++++++- Src/NuGet.Config | 3 +-- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Linq/JTokenWriterTest.cs b/Src/Newtonsoft.Json.Tests/Linq/JTokenWriterTest.cs index a32d55c1..4ca7519c 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JTokenWriterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JTokenWriterTest.cs @@ -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() { diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 7f11634e..0f19c2e8 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -8630,11 +8630,11 @@ Path '', line 1, position 1."); [Test] public void DuplicatePropertiesInNestedObject() { - ExceptionAssert.Throws(() => - { - string content = @"{""result"":{""time"":1408188592,""time"":1408188593},""error"":null,""id"":""1""}"; - JsonConvert.DeserializeObject(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(content); + int time = (int)o["result"]["time"]; + + Assert.AreEqual(1408188593, time); } [Test] diff --git a/Src/Newtonsoft.Json/Linq/JTokenWriter.cs b/Src/Newtonsoft.Json/Linq/JTokenWriter.cs index dd81f5d2..4db0d6ae 100644 --- a/Src/Newtonsoft.Json/Linq/JTokenWriter.cs +++ b/Src/Newtonsoft.Json/Linq/JTokenWriter.cs @@ -166,9 +166,17 @@ namespace Newtonsoft.Json.Linq /// The name of the property. 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); } diff --git a/Src/NuGet.Config b/Src/NuGet.Config index 33020887..5ea93d1c 100644 --- a/Src/NuGet.Config +++ b/Src/NuGet.Config @@ -3,7 +3,6 @@ - - +