【问题标题】:Converting XML to JSON with complex XML data使用复杂的 XML 数据将 XML 转换为 JSON
【发布时间】:2018-08-06 03:07:42
【问题描述】:

我有一个这样的 XML:

       <job>
           <properties>
              <name>jobid</name>
              <value>81963</value>
           </properties>
           <properties>
              <name>status</name>
              <value>complete</value>
           </properties>
           <properties>
              <name>date</name>
              <value>2018-07-30</value>
           </properties>
        </job>
        <job>
           <properties>
              <name>jobid</name>
              <value>81194</value>
           </properties>
           <properties>
              <name>status</name>
              <value>complete</value>
           </properties>
           <properties>
              <name>date</name>
              <value>2018-07-30</value>
           </properties>
        </job>

而我需要做的是获得每个工作的所有属性。我很难遍历它的节点和子节点,但无法得到确切的逻辑。我真正需要做的是将这些数据转换为:

[{
  "jobid": "81963",
  "status": "complete",
  "date": "2018-07-30"
}, 
{
  "jobid": "81194",
  "status": "complete",
  "date": "2018-07-30"
}]

我已经试过了:

foreach (XmlNode child in xn.SelectNodes("properties"))
            {
                arrd.Add(checkNullValue(child["value"]));
            }
            arrd2.AddRange(arrd);

//For Converting to JSON
 try
            {
                var jobVals = getXmlData("test", "testuser2", "654321", "Sources/soapRequest.xml");
            Response.Write(jobVals.Count);

            //JSONIZE list(the XML)
            string json = JsonConvert.SerializeObject(jobVals);
            Response.Write(json);
        }
        catch (Exception ex)
        {
            Response.Write(ex);
        }

请帮忙。

【问题讨论】:

    标签: c# json xml xmlnode


    【解决方案1】:

    使用 Linq to XML

    XDocument xml = //...
    
    var result = xml.Elements("job")
        .Select(job => job
            .Elements("properties")
            .ToDictionary(p => p.Element("name").Value, p => p.Element("value").Value)
        );
    

    result 将包含一个字典集合,在序列化时,

    string json = JsonConvert.SerializeObject(result);
    

    使用 Json.Net 之类的东西会产生所需的结果。

    上面的示例不包括任何验证检查,但可以轻松添加。该示例只是为了展示如何将数据转换为所需的模型。

    【讨论】:

    • 我应该使用 XDocument 还是有针对 XMLDocument 的解决方法?
    【解决方案2】:

    您提供的 JSON 不是有效的 JSON。你可以在哪里使用newtonsoft

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    string json = JsonConvert.SerializeXmlNode(doc);
    

    【讨论】:

    • 我对 JSON 不好。我已经更新了 json 字符串并且现在有效。我实际上将数据转换为 JSON 没有问题。问题是我很难转换我的意思是建立我需要传递给 newtonsoft 的列表。
    • 此方法是否生成所需格式的 JSON?我想这将是[{"properties":[{"name":"jobid","value":"81963"}]},..]
    • @vasily.sib:你是绝对正确的。它不会生成所需格式的 JSON。
    • @OneLazy:你能展示你的结果和预期的结果吗?我希望你在谈论jobs.Add
    • @MohitShrivastava 我再次从上面更新了我的代码,请看一下。我得到的输出是: ["81963","complete","2018-07-30","81194","complete","2018-07-30"] 但我想要的输出仍然是 JSON I从上面放
    【解决方案3】:

    在 XSLT 中非常简单:

    <xsl:template match="/">[<xsl:apply-templates/>]</xsl:template>
    <xsl:template match="job">{<xsl:apply-templates/>}</xsl:template>
    <xsl:template match="properties">"<xsl:value-of select="name"/>":"<xsl:value-of select="value"/>"</xsl:template>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 2017-01-04
      • 2019-12-11
      相关资源
      最近更新 更多