我似乎有问题反序列化这个xml:
<Parameters>
<AParameters>
</AParameters>
<BParameters>
</BParameters>
</Parameters>
成:
public class Parameters
{
public Parameters()
{
AParameters = new AParameters();
BParameters = new BParameters();
}
public AParameters AParameters { get; set; }
public BParameters BParameters { get; set; }
}
使用这些助手:
public string TransformXmlStringToJsonString(string xmlString)
{
try
{
var doc = new XmlDocument();
doc.LoadXml(xmlString);
return JsonConvert.SerializeXmlNode(doc);
}
catch (XmlException e)
{
throw new ArgumentException(string.Format("XML not well formed: {0}", e.Message));
}
}
public Parameters TransformXmlStringToParameters(string xmlString)
{
var jsonString = TransformXmlStringToJsonString(xmlString);
return DeserializeJsonString(jsonString);
}
private static Parameters DeserializeJsonString(string jsonString)
{
return JsonConvert.DeserializeObject<Parameters>(jsonString);
}
AParameters和BParameters的属性未正确补充水分。在这种嵌套情况下,我有什么需要考虑的吗?
答案 0 :(得分:1)
使用JsonConvert.SerializeXmlNode(doc)
将XML文档转换为JSON字符串时,生成的JSON如下所示:
{
"?xml":
{
"@version":"1.0"
},
"Parameters":
{
"AParameters":
{
...
},
"BParameters":
{
...
}
}
}
请注意,Parameters
数据不在根目录,而是在外部对象内。因此,当您尝试将JSON直接反序列化为Parameters
类时,所有属性都不会排列,因为它们都是一个级别。由于JSON.Net无法将类中的字段名称与JSON数据匹配,因此它只使用默认值。
要解决此问题,您可以执行以下两项操作之一。
1)修复您的XML到JSON转换,以便Parameters
数据位于根目录。要使其工作,JSON数据需要如下所示(如下所示)。这可能说起来容易做起来难。
{
"AParameters":
{
...
},
"BParameters":
{
...
}
}
2)创建一个包装类并反序列化。这更容易。例如:
class Wrapper
{
public Parameters Parameters { get; set; }
}
然后像这样反序列化:
Parameters p = JsonConvert.DeserializeObject<Wrapper>(jsonString).Parameters;