我正在从.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>
答案 0 :(得分:2)
正如其他人已经指出的那样,这个API生成的“JSON”肯定是无效的,因为它不符合JSON standard。
我想谈谈你问题的第二部分,“我该怎么办?”
显然,如果您控制生成此JSON的项目或API,那么您应该修复它以使其生成有效的JSON。您应该在内存中构建对象(使用嵌套字典和列表在这里是一个不错的选择),然后序列化,而不是手动编码输出(这很可能是这个输出的来源)他们使用适当的JSON序列化程序,如Json.Net。序列化程序将能够为您将它们转换为正确的JSON。
如果您不控制生成此JSON的sproject或API,那么您应该通知项目作者它正在生成无效输出并要求他们修复它,如果可能的话。
< / LI>如果无法联系项目所有者,或者他/她不能或不会修复它,或者您没有时间等待正确修复,那么您应该切换到使用而是XML版本。这看起来格式正确,您可以使用LINQ-to-XML之类的标准XML类毫无困难地使用它。
如果您绝对必须使用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有效,它需要由键/值对组成。