Ignore culture when converting JSON values to XML attributes

This commit is contained in:
FVoronin
2017-05-15 12:31:20 +05:00
parent 1535268ab8
commit c6d6dcf24a
2 changed files with 56 additions and 2 deletions
@@ -2110,6 +2110,42 @@ namespace Newtonsoft.Json.Tests.Converters
Assert.AreEqual(@"<?xml version=""1.0"" encoding=""utf-8""?><root booleanType=""true"" />", 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(@"<metrics value=""12.27""><type>CPULOAD</type></metrics>", 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();
@@ -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)
{