From 87d99204bf9d0ba8bf9e101be913327f0660a706 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sun, 28 May 2017 12:52:08 +1200 Subject: [PATCH] -Fixed converting JSON byte array data to XML --- .../Converters/XmlNodeConverterTest.cs | 65 +++++++++++++++++++ .../Converters/XmlNodeConverter.cs | 24 ++----- 2 files changed, 70 insertions(+), 19 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index e036629b..d8b87495 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -2146,6 +2146,71 @@ namespace Newtonsoft.Json.Tests.Converters } } + [Test] + public void NullAttributeValue() + { + var node = JsonConvert.DeserializeXmlNode(@"{ + ""metrics"": { + ""type"": ""CPULOAD"", + ""@value"": null + } + }"); + + StringAssert.AreEqual(@"CPULOAD", node.OuterXml); + } + + [Test] + public void NonStandardAttributeValues() + { + JObject o = new JObject + { + new JProperty("root", new JObject + { + new JProperty("@uri", new JValue(new Uri("http://localhost/"))), + new JProperty("@time_span", new JValue(TimeSpan.FromMinutes(1))), + new JProperty("@bytes", new JValue(System.Text.Encoding.UTF8.GetBytes("Hello world"))) + }) + }; + + using (var jsonReader = o.CreateReader()) + { + var serializer = JsonSerializer.Create(new JsonSerializerSettings + { + Converters = { new XmlNodeConverter() }, + }); + + var document = (XmlDocument)serializer.Deserialize(jsonReader, typeof(XmlDocument)); + + StringAssert.AreEqual(@"", document.OuterXml); + } + } + + [Test] + public void NonStandardElementsValues() + { + JObject o = new JObject + { + new JProperty("root", new JObject + { + new JProperty("uri", new JValue(new Uri("http://localhost/"))), + new JProperty("time_span", new JValue(TimeSpan.FromMinutes(1))), + new JProperty("bytes", new JValue(System.Text.Encoding.UTF8.GetBytes("Hello world"))) + }) + }; + + using (var jsonReader = o.CreateReader()) + { + var serializer = JsonSerializer.Create(new JsonSerializerSettings + { + Converters = { new XmlNodeConverter() }, + }); + + var document = (XmlDocument)serializer.Deserialize(jsonReader, typeof(XmlDocument)); + + StringAssert.AreEqual(@"http://localhost/00:01:00SGVsbG8gd29ybGQ=", document.OuterXml); + } + } + private static void JsonBodyToSoapXml(Stream json, Stream xml) { Newtonsoft.Json.JsonSerializerSettings settings = new Newtonsoft.Json.JsonSerializerSettings(); diff --git a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs index 82488052..613f37ba 100644 --- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs @@ -1799,6 +1799,7 @@ namespace Newtonsoft.Json.Converters case JsonToken.Float: case JsonToken.Boolean: case JsonToken.Date: + case JsonToken.Bytes: string text = ConvertTokenToXmlValue(reader); if (text != null) { @@ -1831,25 +1832,7 @@ namespace Newtonsoft.Json.Converters } string encodedName = XmlConvert.EncodeName(attributeName); - string attributeValue = ""; - - switch (reader.TokenType) - { - case JsonToken.String: - case JsonToken.Integer: - case JsonToken.Float: - case JsonToken.Boolean: - case JsonToken.Date: - attributeValue = ConvertTokenToXmlValue(reader); - break; - case JsonToken.Null: - - // empty attribute. do nothing - break; - default: - attributeValue = reader.Value.ToString(); - break; - } + string attributeValue = ConvertTokenToXmlValue(reader); IXmlNode attribute = (!string.IsNullOrEmpty(attributePrefix)) ? document.CreateAttribute(encodedName, manager.LookupNamespace(attributePrefix), attributeValue) @@ -1900,6 +1883,8 @@ namespace Newtonsoft.Json.Converters #else return XmlConvert.ToString(d, DateTimeUtils.ToDateTimeFormat(d.Kind)); #endif + case JsonToken.Bytes: + return Convert.ToBase64String((byte[])reader.Value); case JsonToken.Null: return null; default: @@ -1968,6 +1953,7 @@ namespace Newtonsoft.Json.Converters case JsonToken.Integer: case JsonToken.Float: case JsonToken.Date: + case JsonToken.Bytes: case JsonToken.StartConstructor: return null; }