-Improved error when attempting to convert root JSON object property to an XML attribute

This commit is contained in:
James Newton-King
2016-10-25 14:43:27 +13:00
parent 0e0918b143
commit 29c84fd7c2
2 changed files with 37 additions and 3 deletions
@@ -2701,6 +2701,35 @@ namespace Newtonsoft.Json.Tests.Converters
Assert.AreEqual(json, json2);
}
[Test]
public void RootPropertyError()
{
string json = @"{
""$id"": ""1"",
""AOSLocaleName"": ""en-US"",
""AXLanguage"": ""EN-AU"",
""Company"": ""AURE"",
""CompanyTimeZone"": 8,
""CurrencyInfo"": {
""$id"": ""2"",
""CurrencyCode"": ""AUD"",
""Description"": ""Australian Dollar"",
""ExchangeRate"": 100.0,
""ISOCurrencyCode"": ""AUD"",
""Prefix"": """",
""Suffix"": """"
},
""IsSysAdmin"": true,
""UserId"": ""lamar.miller"",
""UserPreferredCalendar"": 0,
""UserPreferredTimeZone"": 8
}";
ExceptionAssert.Throws<JsonSerializationException>(
() => JsonConvert.DeserializeXmlNode(json),
"JSON root object has property '$id' that will be converted to an attribute. A root object cannot have any attribute properties. Consider specifing a DeserializeRootElementName. Path '$id', line 2, position 12.");
}
[Test]
public void SerializeEmptyNodeAndOmitRoot()
{
@@ -1538,7 +1538,7 @@ namespace Newtonsoft.Json.Converters
string attributeName = propertyName.Substring(1);
string attributePrefix = MiscellaneousUtils.GetPrefix(attributeName);
AddAttribute(reader, document, currentNode, attributeName, manager, attributePrefix);
AddAttribute(reader, document, currentNode, propertyName, attributeName, manager, attributePrefix);
return;
}
@@ -1557,7 +1557,7 @@ namespace Newtonsoft.Json.Converters
case JsonTypeReflector.ValuePropertyName:
string attributeName = propertyName.Substring(1);
string attributePrefix = manager.LookupPrefix(JsonNamespaceUri);
AddAttribute(reader, document, currentNode, attributeName, manager, attributePrefix);
AddAttribute(reader, document, currentNode, propertyName, attributeName, manager, attributePrefix);
return;
}
}
@@ -1614,8 +1614,13 @@ namespace Newtonsoft.Json.Converters
}
}
private static void AddAttribute(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string attributeName, XmlNamespaceManager manager, string attributePrefix)
private static void AddAttribute(JsonReader reader, IXmlDocument document, IXmlNode currentNode, string propertyName, string attributeName, XmlNamespaceManager manager, string attributePrefix)
{
if (currentNode.NodeType == XmlNodeType.Document)
{
throw JsonSerializationException.Create(reader, "JSON root object has property '{0}' that will be converted to an attribute. A root object cannot have any attribute properties. Consider specifing a DeserializeRootElementName.".FormatWith(CultureInfo.InvariantCulture, propertyName));
}
string encodedName = XmlConvert.EncodeName(attributeName);
string attributeValue = reader.Value.ToString();