将Json反序列化为对象

时间:2019-10-09 08:35:00

标签: c# json xamarin

尽管我已经在老学校发展了几年,但是我需要一些有关如何将此json显示到列表视图的帮助。

从URL返回的JSON

[
   {
      "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,例如List从JSON数组反序列化。还可以将JsonArrayAttribute添加到类型中,以强制其从JSON数组反序列化。       路径”,第1行,位置1。

1 个答案:

答案 0 :(得分:4)

您的JSON是对象列表。您正在尝试将其反序列化为单个对象。

尝试做类似的事情:

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

如果您希望以后能够修改列表,并在UI中反映这些更新,则应改用ObservableCollection<T>

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

您的Events类实际上代表一个事件,您可能应该将其重命名为Event