Получение ошибки при разборе ответа Json от службы c#

#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.

Я хочу обратиться ко второй части вашего вопроса: «Что мне делать?»

  1. Очевидно, что если вы управляете проектом или API, который создает этот JSON, то вам следует исправить это, чтобы он выдавал действительный JSON. Вместо ручного кодирования выходных данных (что, скорее всего, и является результатом этого вывода) вам следует вместо этого создавать объекты в памяти (здесь хорошим выбором было бы использование вложенных словарей и списков), а затем сериализовать их, используя надлежащий сериализатор JSON, такой как Json.Net. Сериализатор сможет преобразовать их в правильный JSON для вас.

  2. Если вы НЕ управляете sproject или API, который создает этот JSON, то вам обязательно следует уведомить автора проекта о том, что он выдает неверный вывод, и попросить их исправить это, если это возможно.

  3. Если невозможно связаться с владельцем проекта, или он / она не может или не хочет это исправить, или если у вас нет времени ждать надлежащего исправления, тогда вам следует переключиться на использование версии XML вместо этого. Это выглядит правильно отформатированным, и вы должны быть в состоянии использовать это без каких-либо проблем, используя стандартные классы XML, такие как LINQ-to-XML.

  4. Если вам по какой-либо причине абсолютно необходимо иметь 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»