0

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

4

1 回答 1

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;
于 2013-07-10T19:43:04.777 回答