【问题标题】:Selecting a token using JSON.NET and LINQ使用 JSON.NET 和 LINQ 选择令牌
【发布时间】:2023-03-24 00:00:01
【问题描述】:

我在 C# 中有以下 XML,如下所示:

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
        "<!--PowerStats Table Model Paramter Template Ver 1.0 Created on 11/19/2013-->" +
        "<paramFile version=\"1.0\" createdBy=\"PowerStats v1.0\">" +
        "    <DSNumber value=\"82\" />" +
        "</parmFile>" +
        "<paramFile version=\"2.0\" createdBy=\"PowerStats v2.0\">" +
        "    <DSNumber value=\"83\" />" +
        "</parmFile>";

然后我创建 JSON 来测试(哪个)工作正常:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    string jsonText = JsonConvert.SerializeXmlNode(doc).Replace("\"@", "\"");

但是使用 JToken 我如何获得第一个 paramFile 版本和第二个带有以下代码的版本?我一直为空。

    JToken token = JObject.Parse(jsonText);

    string paramFile = (string)token.SelectToken("paramFile[0].version");

    Response.Write(paramFile);

【问题讨论】:

  • 我很惊讶它没有引发异常,因为您在 XML 中没有单个根元素。您是否尝试打印 jsonText 以查看其结构?
  • 你是对的。如果周围有 2 个带有根的 paramFiles,则该代码有效。我需要弄清楚有多少 paramFiles 可以执行 root.paramFile.version 或 root.paramFile[0].version
  • 您使用 Json.NET 解析 XML 有什么原因吗?为什么不能直接从 XML DOM 获取数据?
  • 我正在根据架构师对我们应用程序的请求将我们所有的 XML 转换为 JSON
  • 所以最终根本不会有 XML

标签: c# .net json linq json.net


【解决方案1】:

就像我们在 cmets 中计算的那样,因为您没有根元素 SerializeXmlNode 只接受第一个元素,因此它不会创建数组。

如果可以修改xml,可以add an attribute that tells SerializeXmlNode to always convert paramFiles to array - even if there is only one

如果您的主要目标是将大量 XML 转换为 JSON,我将建议一种不同的方法。

XML 不能正确地自动转换为 JSON,因为 XML 和 JSON 的结构本质上是不同的。 the result JSON will look weird 或您的情况 - 并不总是正确的。

好的一面是,如果您有架构,XML 可以转换为 JSON。我不是在谈论 XmlSchema 或 JsonSchema(尽管您可能会找到一个使用它们进行转换的工具)——我说的是关于如何构造 XML/JSON 表示的数据的任何定义。如果您的转换考虑了架构,则可以进行正确的自动转换。

现在,您可以将最简单的方式用作架构是 C# 类:

  1. 创建一个表示要转换的数据的类结构。

  2. 使用XmlSerializer.Deserialize 将XML 转换为对象。

  3. 使用JToken.FromObject 将对象转换为JSON。

缺点是您必须编写代表所有数据的类,但这可能是一个隐藏的好处,因为这些类肯定会在未来经常派上用场。毕竟 - 它们确实代表了您的应用程序中使用的数据结构...

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    相关资源
    最近更新 更多