2016-10-21 2 views
0

Я использую api из .NET-проекта, и я получаю ответ json, но я не могу правильно его разобрать, используя Newtonsoft.Json.Получение ошибки при анализе ответа Json из службы C#

Я хочу получить значения как 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

Где ваш код, который анализ ответа, чтобы получить значение (ы) вам нужно? – MattD

+1

Это JSON недействителен он должен быть разобран на «Cell»: { «-name»: «Guid», «#text»: «eda50ef6a96442088e88401ffb4846df» } – mybirthname

ответ

2

Как уже отмечалось, «JSON», создаваемый этим API, определенно недействителен, поскольку он не соответствует JSON standard.

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

  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. См. 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" 
          } 
         } 
         ] 
        } 
        } 
    } 
    
0

Похоже, что JSON имеет неверный формат для меня ... особенно здесь:

  "Row": { 
       "Cell": { 
        "name": "Guid", 
        "eda50ef6a96442088e88401ffb4846df" 
} 

Обратите внимание, что строка, которую вы хотите получить не имеет названия «Key». Таким образом, у Cell Key есть значение, которое является объектом JSON с именем Key (значение которого является «Guid»), но длинная строка не имеет имени ключа.

Он должен иметь ключ для этого значения, что-то вроде этого:

"Row": { 
     "Cell": { 
      "name": "Guid", 
      "value": "eda50ef6a96442088e88401ffb4846df" 
     } 

для JSON, чтобы быть действительным, он должен состоять из пар ключ/значение.

+0

тогда также его неправильно, потому что это будет дубликат ключа «Row» –

Смежные вопросы