我有一个JSON对象,如下所示:
{
"property1": "value1",
"property2": "value2",
"property3": ["value3","value4","value5"]
}
但是,当我尝试使用DeserializeXNode转换为XML时,数组就会消失。
<MyObj>
<property1>value1</property1>
<property2>value2</property2>
<property3>value3</property3>
<property3>value4</property3>
<property3>value5</property3>
</MyObj>
当我尝试重新序列化回到对象时,这会导致问题,因为我得到了一个&#34;无法将字符串转换为字符串[]&#34;错误。此外,当我尝试解析文档时,重复的属性将被覆盖,只剩下最后一个值。我已经尝试将DeserializeXNode的第三个参数设置为true,以便正确标记数组,但这并没有改变任何内容。
根据我对Newtonsoft文档的理解,XML看起来应该更像:
<MyObj>
<property1>value1</property1>
<property2>value2</property2>
<property3 type="array">
<item>value3</item>
<item>value4</item>
<item>value5</item>
</property3>
</MyObj>
我需要做些什么才能让数组正确转换为XML,以便它作为数组返回JSON?
作为参考,这里是我使用的代码(继承,所以我不确定它是否有意义):
ObjectToXML:
var json = JsonConvert.SerializeObject(o);
var xdoc = JsonConvert.DeserializeXNode(json, "MyObj", true);
return xdoc.ToString();
XMLToObject:
XDocument d = XDocument.Parse(xml, LoadOptions.None);
d.Descendants().ForEach(e => e.Attributes().Remove());
var json = JsonConvert.SerializeXNode(d);
json = json.Replace("\"?xml\":{\"@version\":\"1.0\",\"@encoding\":\"utf-16\"},\"MyObj\":{", "")
.Replace("{\"MyObj\":", "")
.Replace("}}", "}")
.Replace("{\"anyType\":", "")
.Replace("]}", "]");
return JsonConvert.DeserializeObject<T>(json);
对象本身:
public class MyObj
{
public string property1 { get; set; }
public string property2 { get; set; }
public string[] property3 { get; set; }
}
答案 0 :(得分:4)
我不确定你在documentation中的哪个位置读过这篇文章。我看了,我找不到任何暗示XML看起来像你建议的那样。
这是如何工作的,可以推断出具有相同名称的多个元素是一个数组。来自文档:
在同一级别具有相同名称的多个节点被组合在一起成为一个数组。
如果只有一个元素来自一个数组,那么您正在使用的重载指示序列化程序添加一个属性,指示该元素是一个数组。你的输出看起来像这样:
<MyObj xmlns:json="http://james.newtonking.com/projects/json">
<property1>value1</property1>
<property2>value2</property2>
<property3 json:Array="true">value3</property3>
</MyObj>
如果您使用此代码通过XML往返它:
var asXml = JsonConvert.DeserializeXNode(json, "MyObj", writeArrayAttribute: true);
var asJson = JsonConvert.SerializeXNode(asXml, Formatting.Indented, omitRootObject: true);
你得到完全相同的JSON。所以我在这里找不到问题。
您可以在this fiddle中看到结果,包括反序列化为MyObj
。