繁体   English   中英

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

[英]Getting error parsing a Json response from a service c#

我正在使用.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>

正如其他人已经指出的那样,此API产生的“ JSON”绝对不合法,因为它不符合JSON标准

我想回答您问题的第二部分,“我该怎么办?”

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

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

  3. 如果无法与项目所有者联系,或者无法解决该问题,或者您没有时间等待适当的修复,则应该改用XML版本。 看起来格式正确,使用LINQ-to-XML之类的标准XML类,您应该可以轻松使用它。

  4. 如果你绝对必须有JSON一起工作,无论出于何种原因,那么你可以尝试使用Json.Net到XML响应直接转换为使用JSON JsonConvert.SerializeXNode

     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"
}

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

它应该具有该值的键,如下所示:

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

为了使JSON有效,它需要包含键/值对。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM