From c6d6dcf24a450c18b8946c5e6b87878195bec76f Mon Sep 17 00:00:00 2001 From: FVoronin Date: Mon, 15 May 2017 12:31:20 +0500 Subject: [PATCH] Ignore culture when converting JSON values to XML attributes --- .../Converters/XmlNodeConverterTest.cs | 36 +++++++++++++++++++ .../Converters/XmlNodeConverter.cs | 22 ++++++++++-- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs index 0c9b3dfb..e036629b 100644 --- a/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs +++ b/Src/Newtonsoft.Json.Tests/Converters/XmlNodeConverterTest.cs @@ -2110,6 +2110,42 @@ namespace Newtonsoft.Json.Tests.Converters Assert.AreEqual(@"", xmlString); } + [Test] + public void IgnoreCultureForTypedAttributes() + { + var originalCulture = System.Threading.Thread.CurrentThread.CurrentCulture; + + try + { + System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("ru"); + + // in russian culture value 12.27 will be written as 12,27 + + var serializer = JsonSerializer.Create(new JsonSerializerSettings + { + Converters = { new XmlNodeConverter() }, + }); + + var json = new StringBuilder(@"{ + ""metrics"": { + ""type"": ""CPULOAD"", + ""@value"": 12.27 + } + }"); + + using (var stringReader = new StringReader(json.ToString())) + using (var jsonReader = new JsonTextReader(stringReader)) + { + var document = (XmlDocument)serializer.Deserialize(jsonReader, typeof(XmlDocument)); + StringAssert.AreEqual(@"CPULOAD", document.OuterXml); + } + } + finally + { + System.Threading.Thread.CurrentThread.CurrentCulture = originalCulture; + } + } + 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 d18b848a..82488052 100644 --- a/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs +++ b/Src/Newtonsoft.Json/Converters/XmlNodeConverter.cs @@ -1831,7 +1831,25 @@ namespace Newtonsoft.Json.Converters } string encodedName = XmlConvert.EncodeName(attributeName); - string attributeValue = reader.Value.ToString(); + 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; + } IXmlNode attribute = (!string.IsNullOrEmpty(attributePrefix)) ? document.CreateAttribute(encodedName, manager.LookupNamespace(attributePrefix), attributeValue) @@ -1840,7 +1858,7 @@ namespace Newtonsoft.Json.Converters ((IXmlElement)currentNode).SetAttributeNode(attribute); } - private string ConvertTokenToXmlValue(JsonReader reader) + private static string ConvertTokenToXmlValue(JsonReader reader) { switch (reader.TokenType) {