c #: десериализация объекта json - PullRequest
0 голосов
/ 29 июня 2018

Я звоню API, В случае успеха я получаю данные JSON в формате списка

[

    {

        "fileName": [
            "file1"
        ],
        "date": [
            "8/25/2015 0:00"
        ],
        "time": [
            "7/16/2009 16:51"
        ],
        "id": "1",
        "version_": 1},
    {

        "fileName": [
            "file1"
        ],
        "date": [
            "8/25/2015 0:00"
        ],
        "time": [
            "7/16/2009 16:51"
        ],
        "id": "1",
        "version_": 1
    }
    ]

При ошибке, когда я передаю неверные данные, ответ в чистом формате json

{
   "resultType": "error",
   "errorType": "validationError",
   "errorCode": "validation.error",
   "apiMessage": "Data Validation issue, please correct the data and try again",
   "validationErrors":    [
            {
         "errorCode": "100211",
         "path": "firstName",
         "apiMessage": "Minimum field length not reached"
      },
            {
         "errorCode": "100241",
         "path": "firstName",
         "apiMessage": "Names must have at least one alphabetic character"
      }
   ],
   "requestId": "3f6fb4b5-42a9-44e5-9ed3-6a50c6fdcc52"
}

Когда нет данных, я получаю

<Empty JSON content>

Как мне справиться со всем этим, когда я получаю ответ

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Если вы получаете 200 как для успешных, так и для неудачных вызовов, вы можете попытаться десериализовать ответ на dynamic, а затем проверить элементы.

dynamic response = JsonConvert.DeserializeObject(json);

См. Аналогичный вопрос здесь: Десериализовать JSON "TryParse" способом .

0 голосов
/ 29 июня 2018

Итак, вы хотите обрабатывать эти различные типы ответов в зависимости от того, что вы получаете ... Ну, во-первых, вы можете перейти к json2csharp и автоматически сгенерировать классы, если вы этого еще не сделали.

Затем вам нужно будет добавить эти классы, и вы получите что-то вроде этого:

public class File
    {
        public class RootObject
        {
            public List<string> fileName { get; set; }
            public List<string> date { get; set; }
            public List<string> time { get; set; }
            public string id { get; set; }
            public int version_ { get; set; }
        }
    }

И в другом классе:

public class Error
    {
        public class ValidationError
        {
            public string errorCode { get; set; }
            public string path { get; set; }
            public string apiMessage { get; set; }
        }

        public class RootObject
        {
            public string resultType { get; set; }
            public string errorType { get; set; }
            public string errorCode { get; set; }
            public string apiMessage { get; set; }
            public List<ValidationError> validationErrors { get; set; }
            public string requestId { get; set; }
        }
    }

Итак, теперь, когда у вас есть классы для десериализации объектов, вам нужно добавить пространство имен json туда, куда вам нужно получить json (если вы не можете его найти, просто установите самородок Newtonsoft.Json):

using Newtonsoft.Json;

Итак, после того, как вы получите свой ответный объект JSON, вы можете просто десериализовать его в список созданных вами объектов:

var file = JsonConvert.DeserializeObject> (ответ);

Поскольку я не получаю эти объекты json, я не могу полностью воспроизвести его, но вы в основном инкапсулируете это в блок try catch, и если он выдаст какие-либо ошибки, вы узнаете, что полученный вами объект не относится к этому типу ( File), но скорее типа (Error), поэтому после того, как вы поймаете ошибку, вы можете сделать то же самое. И должно произойти то же самое с объектом Error, о котором вы знаете, что ничего не получили.

Звоните мне, если у вас есть какие-либо сомнения.

0 голосов
/ 29 июня 2018

Вы можете сначала проверить наличие пустого ответа, а в try-catch попытаться проанализировать массив. Если это не массив, он выдаст исключение, которое вы можете перехватить, и проанализирует объект Json:

string resp; //this is where you will store your response from server
JArray array;
JObject json;
if(resp == "<Empty JSON content>")
{
   Console.WriteLine("Response is empty json");
}
else
{
   try
  {
    array = JArray.Parse(resp);
    Console.WriteLine("Array parsed");
  }
  catch (Newtonsoft.Json.JsonException ex)
  {
      try
      {
         json = JObject.Parse(resp);
         Console.WriteLine("error parsed");
      }
      catch(Newtonsoft.Json.JsonException ex2)
      {
         Console.WriteLine("Response was not json object");
      }        
  }
}
...