从服务c#获取解析Json响应的错误

时间:2016-10-21 19:01:07

标签: c# json

我正在从.NET项目中使用api并且我得到了json响应,但我无法使用Newtonsoft.Json正确解析它。

我希望获得eda50ef6a96442088e88401ffb4846df965507aad38245b1b7cc62a397c9af2e等值。我还用一个在线json验证器检查了这个json,它说它错了。我该怎么办?有帮助吗?

{
    "resp": {
        "state": "ok",
        "Query": {
            "Header": {
                "Cell": {
                    "HeaderName": "Guid",
                    "Type": "System.Guid"
                }
            },
            "Row": {
                "Cell": {
                    "name": "Guid",
                    "eda50ef6a96442088e88401ffb4846df"
                }
            },
            "Row": {
                "Cell": {
                    "name": "Guid",
                    "965507aad38245b1b7cc62a397c9af2e"
                }
            }
        }
    }
}

我还在这里以xml格式提供服务的响应。

<resp state="ok">
  <Query>
    <Header>
      <Cell>
        <HeaderName>Guid</HeaderName>
        <Type>System.Guid</Type>
      </Cell>
    </Header>
    <Row>
      <Cell name="Guid">eda50ef6a96442088e88401ffb4846df</Cell>
    </Row>
    <Row>
      <Cell name="Guid">965507aad38245b1b7cc62a397c9af2e</Cell>
    </Row>
  </Query>
</resp>

2 个答案:

答案 0 :(得分:2)

正如其他人已经指出的那样,这个API生成的“JSON”肯定是无效的,因为它不符合JSON standard

我想谈谈你问题的第二部分,“我该怎么办?”

  1. 显然,如果您控制生成此JSON的项目或API,那么您应该修复它以使其生成有效的JSON。您应该在内存中构建对象(使用嵌套字典和列表在这里是一个不错的选择),然后序列化,而不是手动编码输出(这很可能是这个输出的来源)他们使用适当的JSON序列化程序,如Json.Net。序列化程序将能够为您将它们转换为正确的JSON。

  2. 如果您不控制生成此JSON的sproject或API,那么您应该通知项目作者它正在生成无效输出并要求他们修复它,如果可能的话。

    < / LI>
  3. 如果无法联系项目所有者,或者他/她不能或不会修复它,或者您没有时间等待正确修复,那么您应该切换到使用而是XML版本。这看起来格式正确,您可以使用LINQ-to-XML之类的标准XML类毫无困难地使用它。

  4. 如果您绝对必须使用JSON,无论出于何种原因,您可以尝试使用Json.Net使用JsonConvert.SerializeXNode将XML响应直接转换为JSON:

    string json = JsonConvert.SerializeXNode(XElement.Parse(xml), Formatting.Indented);
    

    但是,这种方法存在一些潜在的缺陷,特别是转换过程可以根据XML中的节点数生成不同的JSON。有关详细信息,请参阅Converting between JSON and XML

    使用您的问题中显示的XML,SerializeXNode将生成此JSON:

    {
      "resp": {
        "@state": "ok",
        "Query": {
          "Header": {
            "Cell": {
              "HeaderName": "Guid",
              "Type": "System.Guid"
            }
          },
          "Row": [
            {
              "Cell": {
                "@name": "Guid",
                "#text": "eda50ef6a96442088e88401ffb4846df"
              }
            },
            {
              "Cell": {
                "@name": "Guid",
                "#text": "965507aad38245b1b7cc62a397c9af2e"
              }
            }
          ]
        }
      }
    }
    

答案 1 :(得分:0)

看起来JSON对我来说是不正确的......特别是在这里:

            "Row": {
                "Cell": {
                    "name": "Guid",
                    "eda50ef6a96442088e88401ffb4846df"
}

请注意,您要获取的字符串没有“Key”名称。因此,Cell Key的值为JSON对象,其名称为Key(其值为“Guid”),但长字符串没有键名。

它应该有一个键值,如下所示:

    "Row": {
        "Cell": {
            "name": "Guid",
            "value": "eda50ef6a96442088e88401ffb4846df"
        }

要使JSON有效,它需要由键/值对组成。