Десериализовать Json в объект - PullRequest
0 голосов
/ 09 октября 2019

, хотя я уже несколько лет развиваю старую школу, мне нужна помощь в том, как отобразить этот json в виде списка.

JSON возвращается с URL

[
   {
      "LastUpdated":"09/10/2019 09:08:02",
      "Latitude":-33.917713,
      "Longitude":18.431315,
      "PlannedEndDate":"",
      "Reported":"09/10/2019 09:00:38",
      "StartDate":"09/10/2019 09:00:38",
      "ID":"WC-ATMS-196763",
      "RegionName":"Western Cape",
      "CountyName":null,
      "Severity":"none",
      "RoadwayName":"Table Bay Blvd",
      "DirectionOfTravel":"Inbound",
      "Description":null,
      "Location":"0.0 km after N2 Elevated Freeway",
      "LanesAffected":null,
      "LanesStatus":null,
      "LcsEntries":null,
      "NavteqLinkId":"771421441",
      "PrimaryLocation":null,
      "SecondaryLocation":null,
      "FirstArticleCity":null,
      "SecondCity":null,
      "EventType":"TrafficConditions",
      "EventSubType":"Mainline Congestion",
      "MapEncodedPolyline":null
   },
   {
      "LastUpdated":"09/10/2019 09:30:02",
      "Latitude":-26.0378,
      "Longitude":28.016144,
      "PlannedEndDate":"",
      "Reported":"09/10/2019 08:08:25",
      "StartDate":"09/10/2019 08:08:25",
      "ID":"GP-ATMS-207804",
      "RegionName":"Gauteng",
      "CountyName":null,
      "Severity":"minor",
      "RoadwayName":"N1",
      "DirectionOfTravel":"Southbound",
      "Description":null,
      "Location":"0.7 km before Ramp from William Nicol I/C",
      "LanesAffected":null,
      "LanesStatus":null,
      "LcsEntries":null,
      "NavteqLinkId":"837759156",
      "PrimaryLocation":null,
      "SecondaryLocation":null,
      "FirstArticleCity":null,
      "SecondCity":null,
      "EventType":"TrafficConditions",
      "EventSubType":"Ramp Congestion",
      "MapEncodedPolyline":null
   },
   {
      "LastUpdated":"09/10/2019 09:52:20",
      "Latitude":-33.944828,
      "Longitude":18.472132,
      "PlannedEndDate":"",
      "Reported":"09/10/2019 09:49:42",
      "StartDate":"09/10/2019 09:49:42",
      "ID":"WC-ATMS-196773",
      "RegionName":"Western Cape",
      "CountyName":null,
      "Severity":"none",
      "RoadwayName":"N2",
      "DirectionOfTravel":"Inbound",
      "Description":null,
      "Location":"0.0 km after Ramp to Mowbray Main",
      "LanesAffected":null,
      "LanesStatus":null,
      "LcsEntries":null,
      "NavteqLinkId":"771096842",
      "PrimaryLocation":null,
      "SecondaryLocation":null,
      "FirstArticleCity":null,
      "SecondCity":null,
      "EventType":"AccidentsAndIncidents",
      "EventSubType":"Shoulder Lane",
      "MapEncodedPolyline":null
   }
]

Объект событий

public class Events
{
    public string LastUpdated { get; set; }
    public float Latitude { get; set; }
    public float Longitude { get; set; }
    public string PlannedEndDate { get; set; }
    public string Reported { get; set; }
    public string StartDate { get; set; }
    public string ID { get; set; }
    public string RegionName { get; set; }
    public object CountyName { get; set; }
    public string Severity { get; set; }
    public string RoadwayName { get; set; }
    public string DirectionOfTravel { get; set; }
    public object Description { get; set; }
    public string Location { get; set; }
    public string LanesAffected { get; set; }
    public object LanesStatus { get; set; }
    public object LcsEntries { get; set; }
    public string NavteqLinkId { get; set; }
    public object PrimaryLocation { get; set; }
    public object SecondaryLocation { get; set; }
    public object FirstArticleCity { get; set; }
    public object SecondCity { get; set; }
    public string EventType { get; set; }
    public string EventSubType { get; set; }
    public object MapEncodedPolyline { get; set; }
}

Код

ObservableCollection<Events> events = new ObservableCollection<Events>();
Events events = JsonConvert.DeserializeObject<Events>(json);
lvEvents.ItemsSource = events;

xaml

 <ListView x:Name="lvEvents" ItemsSource="{Binding Events}" >
    <ListView.ItemTemplate>
          <DataTemplate>
               <Label Text="{Binding RegionName}" ></Label>
          </DataTemplate>
    </ListView.ItemTemplate>                
 </ListView>

Ошибка:

Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип 'Project.View.Events', поскольку для типа требуется объект JSON (например, {"name":" value "}) для правильной десериализации. Чтобы исправить эту ошибку, измените JSON на объект JSON (например, {"name": "value"}) или измените десериализованный тип на массив или тип, который реализует интерфейс коллекции (например, ICollection, IList), например List, который можетбыть десериализованным из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы принудительно десериализовать его из массива JSON. Путь '', строка 1, позиция 1.

1 Ответ

4 голосов
/ 09 октября 2019

Ваш JSON - это список объектов. Вы пытаетесь десериализовать его как один объект.

Попробуйте сделать что-то вроде:

List<Events> events = JsonConvert.DeserializeObject<List<Events>>(json);
lvEvents.ItemsSource = events;

Если вы хотите изменить список позже и отразить эти обновления впользовательский интерфейс, вы должны использовать ObservableCollection<T> вместо:

ObservableCollection<Events> events = JsonConvert.DeserializeObject<ObservableCollection<Events>>(json);
lvEvents.ItemsSource = events;

Ваш класс Events фактически представляет отдельное событие, и вам, вероятно, следует переименовать его в Event.

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