#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);
Комментарии:
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>>(содержимое);