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;
}