从服务c#解析Json响应时出错
本文关键字:响应 出错 Json 解析 服务 | 更新日期: 2023-09-27 18:14:20
我正在从。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标准。
我想回答你问题的第二部分,"我该怎么办?"
-
显然,如果你控制的项目或API是产生这个JSON,那么你应该修复它,使其产生有效的JSON。而不是手工编码输出(这是最有可能的输出方式),您应该在内存中构建对象(使用嵌套字典和列表将是一个很好的选择),然后使用适当的JSON序列化器(如Json.Net) 序列化它们。序列化器可以将它们转换成正确的JSON。
-
如果你不控制生成这个JSON的项目或API,那么你应该明确通知项目作者它正在生成无效的输出,并要求他们修复它,如果可能的话。
-
如果无法联系到项目所有者,或者他/她不能或不会修复它,或者如果您没有时间等待适当的修复,那么您应该切换到使用XML版本。这看起来是正确的格式,你应该能够使用标准的XML类,如LINQ-to-XML,没有任何麻烦。
-
如果你绝对必须有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有效,它需要由键/值对组成。