HttpClient не возвращает данные API, соответствующие моей модели

#c# #asp.net-core #asp.net-core-3.1

#c# #asp.net-core #asp.net-core-3.1

Вопрос:

Привет написал небольшое веб-приложение, которое подключается к API.

Он подключается к API и возвращает данные, как вы можете видеть здесь:

  astroTechItem= await Http.GetFromJsonAsync<AstroTechItem[]>("api/AstroTechItem/34");
  

И он возвращает следующий JSON:

 {
"objectId": 34,
"scopeId": 3,
"title": "solar telescope",
"completed": false
  

}

В моем приложении у меня есть эта модель:

 private class AstroTechItem
{
    public long Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
}
  

И я десериализуюсь следующим образом:

 JsonSerializer serializer = new JsonSerializer();

try
{
    return serializer.Deserialize<AstroTechItem>(jsonReader);
}
catch(JsonReaderException)
{
    Console.WriteLine("Invalid JSON.");
} 
}
else
{
    Console.WriteLine("HTTP Response was invalid and cannot be deserialised.");
}
  

Но моя модель не соответствует тому, что возвращает API.

Моя консоль продолжает показывать: Invalid JSON.

Нужно ли мне связаться с создателем API и попросить его изменить его?

Или есть способ вставить этот JSON в мою модель?

Я не могу понять это.

Спасибо!

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

1. Какую библиотеку сериализации JSON вы используете? Должны быть атрибуты аннотаций членов, позволяющие определять имена свойств json. Например, для Newtonsoft json.net есть [JsonProperty("json_name")] , ибо Text.Serialization.Json есть [JsonPropertyName("json_name"])

Ответ №1:

Чтобы десериализовать json в модель, свойства модели должны соответствовать свойствам json. Или вы можете аннотировать модель именами свойств json. В вашем случае ни одно из свойств не совпадает.

Проще всего обновить модель, чтобы согласовать ее с внешним API следующим образом:

 private class AstroTechItem
{
  public long ObjectId { get; set; }
  public long ScopeId { get; set; }
  public string Title { get; set; }
  public bool Completed { get; set; }
}
  

В противном случае вы можете аннотировать модель:

 private class AstroTechItem
{
  [JsonProperty("objectId")]
  public long Id { get; set; }
  [JsonProperty("title")]
  public string Name { get; set; }
  [JsonProperty("isComplete")]
  public bool Completed { get; set; }
}