Json объект не будет десериализован в c# - PullRequest
0 голосов
/ 09 июля 2020
• 1000 *https://services.marinetraffic.com/api/vesselmasterdata/v: 3 / APiKey / imo: 9661792 / protocol: jsono

Это класс объекта.

public partial class MaraineApiData {
    [JsonProperty("METADATA")]
    public Metadata Metadata { get; set; }

    [JsonProperty("DATA")]
    public List<Datum> Data { get; set; }
}

public partial class Datum {
    [JsonProperty("MMSI")]
    
    public long Mmsi { get; set; }

    [JsonProperty("IMO")]
            public long Imo { get; set; }

    [JsonProperty("NAME")]
    public string Name { get; set; }

    [JsonProperty("PLACE_OF_BUILD")]
    public string PlaceOfBuild { get; set; }

    [JsonProperty("BUILD")]
    public long Build { get; set; }

    [JsonProperty("BREADTH_EXTREME")]
    public long BreadthExtreme { get; set; }

    [JsonProperty("SUMMER_DWT")]
    public long SummerDwt { get; set; }

    [JsonProperty("DISPLACEMENT_SUMMER")]
    public string DisplacementSummer { get; set; }

    [JsonProperty("CALLSIGN")]
    public string Callsign { get; set; }

    [JsonProperty("FLAG")]
    public string Flag { get; set; }

    [JsonProperty("DRAUGHT")]
    public string Draught { get; set; }

    [JsonProperty("LENGTH_OVERALL")]
     public long LengthOverall { get; set; }

    [JsonProperty("FUEL_CONSUMPTION")]
    public string FuelConsumption { get; set; }

    [JsonProperty("SPEED_MAX")]
    public string SpeedMax { get; set; }

    [JsonProperty("SPEED_SERVICE")]
    public string SpeedService { get; set; }

    [JsonProperty("LIQUID_OIL")]
    public string LiquidOil { get; set; }

    [JsonProperty("OWNER")]
    public string Owner { get; set; }

    [JsonProperty("MANAGER")]
    public string Manager { get; set; }

    [JsonProperty("MANAGER_OWNER")]
    public string ManagerOwner { get; set; }

    [JsonProperty("VESSEL_TYPE")]
    public string VesselType { get; set; }
}

public partial class Metadata {
    [JsonProperty("TOTAL_RESULTS")]
    public long TotalResults { get; set; }

    [JsonProperty("TOTAL_PAGES")]
    public long TotalPages { get; set; }

    [JsonProperty("CURRENT_PAGE")]
    public long CurrentPage { get; set; }
}

Но вот как я использую, чтобы получить свой данные из API.

public async Task<List<Metadata>> GetMarineApiData(string IMOCode) {
   string VechnicleDataURL = $"vesselmasterdata/v:3/{ApiKey}/imo:{IMOCode}/protocol:jsono";
   List<Metadata> _result = new List<Metadata>();
   var uri = new Uri(string.Format(APIUrl + VechnicleDataURL, string.Empty));
   var response = await _client.GetAsync(uri);
   if (response.IsSuccessStatusCode) {
     var byteArray = await response.Content.ReadAsByteArrayAsync();
     var content = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
      _result = JsonConvert.DeserializeObject<List<Metadata>>(content);
   }
  return _result.ToList();
 }

Ошибка

O> Невозможно десериализовать текущий JSON объект (например, {"name": "value"})

в тип 'System.Collections.Generi c .List`1 [MISSystem.Dal.Metadata]', потому что для правильной десериализации типу требуется массив JSON (например, [1,2,3]). Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип, чтобы он стал нормальным. NET type (

1 Ответ

4 голосов
/ 09 июля 2020

Указанная вами строка api возвращает не массив, а объект:

{
 "METADATA": { ...},
 "DATA": [{...}]
}

Попробуйте заменить

JsonConvert.DeserializeObject<List<Metadata>>(content);

на

JsonConvert.DeserializeObject<MaraineApiData >(content);

и это должно быть хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...