#c# #json
#c# #json
Вопрос:
Я использую API из проекта .NET и получаю ответ 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>
Комментарии:
1. Где ваш код, который анализирует ответ, чтобы получить нужные вам значения?
2. Этот json недопустим, его следует разобрать в «Ячейку»: { «-name»: «Guid», «#text»: «eda50ef6a96442088e88401ffb4846df»}
Ответ №1:
Как уже указывали другие, «JSON», создаваемый этим API, определенно недействителен, поскольку он не соответствует стандарту JSON.
Я хочу обратиться ко второй части вашего вопроса: «Что мне делать?»
-
Очевидно, что если вы управляете проектом или API, который создает этот JSON, то вам следует исправить это, чтобы он выдавал действительный JSON. Вместо ручного кодирования выходных данных (что, скорее всего, и является результатом этого вывода) вам следует вместо этого создавать объекты в памяти (здесь хорошим выбором было бы использование вложенных словарей и списков), а затем сериализовать их, используя надлежащий сериализатор JSON, такой как Json.Net. Сериализатор сможет преобразовать их в правильный JSON для вас.
-
Если вы НЕ управляете sproject или API, который создает этот JSON, то вам обязательно следует уведомить автора проекта о том, что он выдает неверный вывод, и попросить их исправить это, если это возможно.
-
Если невозможно связаться с владельцем проекта, или он / она не может или не хочет это исправить, или если у вас нет времени ждать надлежащего исправления, тогда вам следует переключиться на использование версии XML вместо этого. Это выглядит правильно отформатированным, и вы должны быть в состоянии использовать это без каких-либо проблем, используя стандартные классы XML, такие как LINQ-to-XML.
-
Если вам по какой-либо причине абсолютно необходимо иметь JSON для работы, то вы можете попробовать использовать Json.Net для преобразования XML-ответа непосредственно в JSON с помощью
JsonConvert.SerializeXNode
:string json = JsonConvert.SerializeXNode(XElement.Parse(xml), Formatting.Indented);
Однако при таком подходе есть некоторые потенциальные подводные камни, в частности, то, что процесс преобразования может выдавать разные JSON в зависимости от количества узлов в XML. Для получения дополнительной информации см. раздел Преобразование между 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" } } ] } } }
Ответ №2:
Похоже, что JSON неверно сформирован для меня … особенно здесь:
"Row": {
"Cell": {
"name": "Guid",
"eda50ef6a96442088e88401ffb4846df"
}
Обратите внимание, что строка, которую вы хотите получить, не имеет имени «Key». Итак, ключ ячейки имеет значение, которое является объектом JSON с ключом name (значение которого равно «Guid»), но длинная строка не имеет имени ключа.
В нем должен быть ключ для этого значения, что-то вроде этого:
"Row": {
"Cell": {
"name": "Guid",
"value": "eda50ef6a96442088e88401ffb4846df"
}
Чтобы JSON был действительным, он должен состоять из пар ключ / значение.
Комментарии:
1. тогда также это неверно, потому что это будет дубликат ключа «Row»