diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index 15a29bf1..8684df2c 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -130,6 +130,36 @@ namespace Newtonsoft.Json.Tests.Converters } #if !NET20 + [Test] + public void SerializeDollarProperty() + { + string json1 = @"{""$"":""test""}"; + + var doc = JsonConvert.DeserializeXNode(json1); + + Assert.AreEqual(@"<_x0024_>test", doc.ToString()); + + var json2 = JsonConvert.SerializeXNode(doc); + + Assert.AreEqual(json1, json2); + } + + [Test] + public void SerializeNonKnownDollarProperty() + { + string json1 = @"{""$JELLY"":""test""}"; + + var doc = JsonConvert.DeserializeXNode(json1); + + Console.WriteLine(doc.ToString()); + + Assert.AreEqual(@"<_x0024_JELLY>test", doc.ToString()); + + var json2 = JsonConvert.SerializeXNode(doc); + + Assert.AreEqual(json1, json2); + } + public class MyModel { public string MyProperty { get; set; } diff --git a/Src/Newtonsoft.Json.Tests/PerformanceTests.cs b/Src/Newtonsoft.Json.Tests/PerformanceTests.cs index 230570f7..7fdd7ec7 100644 --- a/Src/Newtonsoft.Json.Tests/PerformanceTests.cs +++ b/Src/Newtonsoft.Json.Tests/PerformanceTests.cs @@ -23,10 +23,9 @@ // OTHER DEALINGS IN THE SOFTWARE. #endregion -#if !(NET20 || NET35 || NET40 || NETFX_CORE || PORTABLE || PORTABLE40 || DNXCORE50) +#if !(NET20 || NET35 || NET40 || NETFX_CORE || PORTABLE40 || DNXCORE50) using System.Xml; using System; -using System.Buffers; using System.Collections; using System.Collections.Generic; using System.Globalization; @@ -258,6 +257,7 @@ namespace Newtonsoft.Json.Tests } #if !(PORTABLE40) +#if !(PORTABLE) [Test] public void ConvertXmlNode() { @@ -269,6 +269,7 @@ namespace Newtonsoft.Json.Tests JsonConvert.SerializeXmlNode(doc); } +#endif [Test] public void ConvertXNode() diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs index 438bb0f1..034ec5e8 100644 --- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs @@ -1540,26 +1540,30 @@ namespace Newtonsoft.Json.Converters string attributePrefix = MiscellaneousUtils.GetPrefix(attributeName); AddAttribute(reader, document, currentNode, attributeName, manager, attributePrefix); + return; } - else if (propertyName.StartsWith('$')) + + if (propertyName.StartsWith('$')) { - if (propertyName == JsonTypeReflector.ArrayValuesPropertyName) + switch (propertyName) { - propertyName = propertyName.Substring(1); - elementPrefix = manager.LookupPrefix(JsonNamespaceUri); - CreateElement(reader, document, currentNode, propertyName, manager, elementPrefix, attributeNameValues); - } - else - { - string attributeName = propertyName.Substring(1); - string attributePrefix = manager.LookupPrefix(JsonNamespaceUri); - AddAttribute(reader, document, currentNode, attributeName, manager, attributePrefix); + case JsonTypeReflector.ArrayValuesPropertyName: + propertyName = propertyName.Substring(1); + elementPrefix = manager.LookupPrefix(JsonNamespaceUri); + CreateElement(reader, document, currentNode, propertyName, manager, elementPrefix, attributeNameValues); + return; + case JsonTypeReflector.IdPropertyName: + case JsonTypeReflector.RefPropertyName: + case JsonTypeReflector.TypePropertyName: + case JsonTypeReflector.ValuePropertyName: + string attributeName = propertyName.Substring(1); + string attributePrefix = manager.LookupPrefix(JsonNamespaceUri); + AddAttribute(reader, document, currentNode, attributeName, manager, attributePrefix); + return; } } - else - { - CreateElement(reader, document, currentNode, propertyName, manager, elementPrefix, attributeNameValues); - } + + CreateElement(reader, document, currentNode, propertyName, manager, elementPrefix, attributeNameValues); } private void CreateElement(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string elementName, XmlNamespaceManager manager, string elementPrefix, Dictionary attributeNameValues) @@ -1776,40 +1780,52 @@ namespace Newtonsoft.Json.Converters } break; case '$': - // check that JsonNamespaceUri is in scope - // if it isn't then add it to document and namespace manager - string jsonPrefix = manager.LookupPrefix(JsonNamespaceUri); - if (jsonPrefix == null) + switch (attributeName) { - // ensure that the prefix used is free - int? i = null; - while (manager.LookupNamespace("json" + i) != null) - { - i = i.GetValueOrDefault() + 1; - } - jsonPrefix = "json" + i; + case JsonTypeReflector.ArrayValuesPropertyName: + case JsonTypeReflector.IdPropertyName: + case JsonTypeReflector.RefPropertyName: + case JsonTypeReflector.TypePropertyName: + case JsonTypeReflector.ValuePropertyName: + // check that JsonNamespaceUri is in scope + // if it isn't then add it to document and namespace manager + string jsonPrefix = manager.LookupPrefix(JsonNamespaceUri); + if (jsonPrefix == null) + { + // ensure that the prefix used is free + int? i = null; + while (manager.LookupNamespace("json" + i) != null) + { + i = i.GetValueOrDefault() + 1; + } + jsonPrefix = "json" + i; - attributeNameValues.Add("xmlns:" + jsonPrefix, JsonNamespaceUri); - manager.AddNamespace(jsonPrefix, JsonNamespaceUri); + attributeNameValues.Add("xmlns:" + jsonPrefix, JsonNamespaceUri); + manager.AddNamespace(jsonPrefix, JsonNamespaceUri); + } + + // special case $values, it will have a non-primitive value + if (attributeName == JsonTypeReflector.ArrayValuesPropertyName) + { + finishedAttributes = true; + break; + } + + attributeName = attributeName.Substring(1); + reader.Read(); + + if (!JsonTokenUtils.IsPrimitiveToken(reader.TokenType)) + { + throw JsonSerializationException.Create(reader, "Unexpected JsonToken: " + reader.TokenType); + } + + attributeValue = (reader.Value != null) ? reader.Value.ToString() : null; + attributeNameValues.Add(jsonPrefix + ":" + attributeName, attributeValue); + break; + default: + finishedAttributes = true; + break; } - - // special case $values, it will have a non-primitive value - if (attributeName == JsonTypeReflector.ArrayValuesPropertyName) - { - finishedAttributes = true; - break; - } - - attributeName = attributeName.Substring(1); - reader.Read(); - - if (!JsonTokenUtils.IsPrimitiveToken(reader.TokenType)) - { - throw JsonSerializationException.Create(reader, "Unexpected JsonToken: " + reader.TokenType); - } - - attributeValue = (reader.Value != null) ? reader.Value.ToString() : null; - attributeNameValues.Add(jsonPrefix + ":" + attributeName, attributeValue); break; default: finishedAttributes = true;