Невозможно десериализовать массив JSON (например, [1,2,3]) в тип», потому что для типа требуется объект JSON (например, {«имя»:»значение»}) для десериализации с помощью GenericType

#c# #json #asp.net-web-api #json-deserialization #webapi

Вопрос:

Это мой JSON

 {
  "states": [
    {
      "state_id": 1,
      "state_name": "Andaman and Nicobar Islands"
    },
    {
      "state_id": 2,
      "state_name": "Andhra Pradesh"
    },
    {
      "state_id": 3,
      "state_name": "Arunachal Pradesh"
    },
    ...
    {
      "state_id": 36,
      "state_name": "West Bengal"
    }
  ],
  "ttl": 24
}

 

Это мой класс моделей

 
    public class State
    {
        [JsonConstructor]
        public State(int stateId,string stateName)
        {
            this.StateId = stateId;
            this.StateName = stateName;
        }

        [JsonPropertyName("state_id")]
        public int StateId { get; set; }

        [JsonPropertyName("state_name")]
        public  string StateName { get; set; }
    }

    public class ApiSevuModels
    {
        [JsonConstructor]
        public ApiSevuModels(List<State> states,int ttl)
        {
            this.States = states;
            this.Ttl = ttl;
        }

        [JsonPropertyName("states")]
        public  List<State> States { get; set; }

        [JsonPropertyName("ttl")]
        public int Ttl { get; set; }
    }
 

Это мой класс Conttoller для десериализации

 namespace ExternalApi.demo.Controllers
{
    public class StatesController : Controller
    {

        // GET: States
        public async Task<ActionResult> Index()
        {
         IEnumerable<State> apiStates = null;
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("https://cdn-api.co-vin.in/api/v2/admin/location/");
                client.DefaultRequestHeaders.Accept.Clear();
                //HTTP GET


                HttpResponseMessage result = await client.GetAsync("states");
                if (result.IsSuccessStatusCode)
                {
                    var part=result.ReasonPhrase;
                    var content = await result.Content.ReadAsStringAsync();
                 apiStates=JsonConvert.DeserializeObject<IList<State>>(content);
                }
                else //web api sent error response 
                {
                    //log response status here..

                   
                    
                    ModelState.AddModelError(string.Empty, "Server error. Please contact administrator.");
                }
            }
            return View(apiStates);
        }
    }
}
 

И мой вопрос в том, что во время выполнения этого кода я ожидал, что не смогу десериализовать массив JSON (например, [1,2,3]) в тип», потому что для правильной десериализации типа требуется объект JSON (например, {«имя»:»значение»}).

Комментарии:

1. Можете ли вы включить пример JSON, который вы получаете. Скорее всего, вы получаете JSON, который представляет объект, а не массив.

2. Ваш JSON представляет собой экземпляр ApiSevuModels , а не набор State элементов. Попробуй JsonConvert.DeserializeObject<ApiSevuModels>(content) вместо этого.

Ответ №1:

Ваш JSON представляет собой экземпляр моделей APISEVUM, корневой объект имеет ключи states и ttl . Это не набор State предметов, это уровень глубже.

Чтобы десериализовать это правильно, вам нужно будет десериализоваться в экземпляр ApiSevuModels instead.

 ApiSevuModels apiStates = null;
apiStates = JsonConvert.DeserializeObject<ApiSevuModels>(content);
 

Вот страница dotnetfiddle, показывающая, как работает код

Комментарии:

1. Но это тоже не работает

2. Невозможно десериализовать текущий объект JSON (например, {«имя»:»значение»}) в систему типа’. Коллекции. Общий. IList`1[Внешний интерфейс.демо. Модели. ApiSevuModels]’ , потому что для правильной десериализации типа требуется массив JSON (например, [1,2,3]). Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип, чтобы он был обычным . ЧИСТЫЙ тип (например, не примитивный тип, такой как целое число, не тип коллекции, такой как массив или список<T>), который может быть десериализован из объекта JSON.

3. Это похоже на вашу первоначальную ошибку, которая ищет массив JSON, а не объект JSON, можете ли вы дважды проверить тип, в который вы пытаетесь десериализоваться — это ApiSevuModels не должно быть IList<State> .

4. IEnumerable<ApiSevuModels> Апистаты = null;

5. apiStates=JsonConvert. Десериализацияобъекта<IList<ApiSevuModels><ApiSevuModels>>(содержимое);