[英]Getting error parsing a Json response from a service c#
我正在使用.NET项目中的api,并且收到json响应,但是我无法使用Newtonsoft.Json正确解析它。
我想获取eda50ef6a96442088e88401ffb4846df
或965507aad38245b1b7cc62a397c9af2e
类的值。 我还用在线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标准 。
我想回答您问题的第二部分,“我该怎么办?”
显然,如果您控制生成此JSON的项目或API,则应对其进行修复以使其生成有效的JSON。 相反手工编码输出(这是最有可能这个输出是怎么来的),你应该不是建立在内存中的对象(使用嵌套的字典和列表会在这里一个不错的选择),然后使用适当的JSON序列像它们序列的Json.Net 序列化程序将能够为您将它们转换为正确的JSON。
如果您不控制生成此JSON的sproject或API,那么您绝对应该通知项目作者它正在生成无效的输出,并在可能的情况下要求他们对其进行修复。
如果无法与项目所有者联系,或者无法解决该问题,或者您没有时间等待适当的修复,则应该改用XML版本。 看起来格式正确,使用LINQ-to-XML之类的标准XML类,您应该可以轻松使用它。
如果你绝对必须有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.