从服务c#解析Json响应时出错

本文关键字:响应 出错 Json 解析 服务 | 更新日期: 2023-09-27 18:14:20

我正在从。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>

从服务c#解析Json响应时出错

正如其他人已经指出的那样,这个API生成的"JSON"绝对是无效的,因为它不符合JSON标准。

我想回答你问题的第二部分,"我该怎么办?"

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

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

  3. 如果无法联系到项目所有者,或者他/她不能或不会修复它,或者如果您没有时间等待适当的修复,那么您应该切换到使用XML版本。这看起来是正确的格式,你应该能够使用标准的XML类,如LINQ-to-XML,没有任何麻烦。

  4. 如果你绝对必须有JSON工作,无论出于什么原因,那么你可以尝试使用JSON。使用JsonConvert.SerializeXNode将XML响应直接转换为JSON:

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

    然而,这种方法存在一些潜在的缺陷,值得注意的是,转换过程可能根据XML中的节点数量产生不同的JSON。更多信息请参见JSON和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"
              }
            }
          ]
        }
      }
    }
    

看起来JSON对我来说是畸形的…特别是:

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

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

这个值应该有一个键,像这样:

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

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