通过json.net反序列化嵌套的xml

时间:2013-07-10 17:32:10

标签: c# json.net xml-deserialization

我似乎有问题反序列化这个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的属性未正确补充水分。在这种嵌套情况下,我有什么需要考虑的吗?

1 个答案:

答案 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;