C# 使用不同类型的值解析json(Newtonsoft.json)
帮助我用C# 使用不同类型的值解析json(Newtonsoft.json),c#,json,windows-phone-7,windows-phone-8,json.net,C#,Json,Windows Phone 7,Windows Phone 8,Json.net,帮助我用Newtonsoft.json解析json { "_id": 160, "location": { "type": "Point", "coordinates": [43.59043144045182, 39.72119003534317] }, }, { "_id": 161, "location": { "type": "LineString", "coordinates
Newtonsoft.json
解析json
{
"_id": 160,
"location": {
"type": "Point",
"coordinates": [43.59043144045182, 39.72119003534317]
},
},
{
"_id": 161,
"location": {
"type": "LineString",
"coordinates": [
[43.58780105200211, 39.719191789627075],
[43.58817794899264, 39.719465374946594]
]
},
},
{
"_id": 152,
"location": {
"type": "Polygon",
"coordinates": [
[43.590524759627954, 39.71930980682373],
[43.590474249766544, 39.71926689147949],
[43.59043151061995, 39.71934735774994],
[43.59073456936772, 39.71958339214325],
[43.59076565222992, 39.71949219703674]
]
},
}
键
坐标
具有类型列表
或列表
,具体取决于键类型
(多边形、线串、点)。您可以使用自定义的JsonConverter
解决此问题。转换器可以加载每个形状的数据,查看类型
字段,然后相应地填充坐标数组。实际上,如果您愿意,转换器可以在这里执行双重任务,以便在我们进行转换时将数据平铺成更简单的类结构。考虑到您提供的JSON,我将这样做
首先,定义一个类来保存反序列化的形状数据。我们将反序列化为以下列表:
class Shape
{
public int Id { get; set; }
public string Type { get; set; }
public List<List<double>> Coordinates { get; set; }
}
将[JsonConverter]
属性添加到Shape
类以将其绑定到ShapeConverter
:
[JsonConverter(typeof(ShapeConverter))]
class Shape
{
...
}
剩下的就是对JSON进行反序列化,我们可以这样做:
List<Shape> shapes = JsonConvert.DeserializeObject<List<Shape>>(json);
如果您想变得更奇特,可以对每个坐标使用
点
结构而不是列表
,和/或可以为每种类型的复杂形状(例如直线、多边形)创建实际的类层次结构,并将它们组成点
。如果需要,修改转换器以创建这些对象并不困难。我将把这部分留给您。您可以使用自定义的JsonConverter
解决此问题。转换器可以加载每个形状的数据,查看类型
字段,然后相应地填充坐标数组。实际上,如果您愿意,转换器可以在这里执行双重任务,以便在我们进行转换时将数据平铺成更简单的类结构。考虑到您提供的JSON,我将这样做
首先,定义一个类来保存反序列化的形状数据。我们将反序列化为以下列表:
class Shape
{
public int Id { get; set; }
public string Type { get; set; }
public List<List<double>> Coordinates { get; set; }
}
将[JsonConverter]
属性添加到Shape
类以将其绑定到ShapeConverter
:
[JsonConverter(typeof(ShapeConverter))]
class Shape
{
...
}
剩下的就是对JSON进行反序列化,我们可以这样做:
List<Shape> shapes = JsonConvert.DeserializeObject<List<Shape>>(json);
如果您想变得更奇特,可以对每个坐标使用
点
结构而不是列表
,和/或可以为每种类型的复杂形状(例如直线、多边形)创建实际的类层次结构,并将它们组成点
。如果需要,修改转换器以创建这些对象并不困难。我把那部分留给你。你试过什么?另外,您看过json.net中的linq到json吗?它允许使用JObject/JArray进行相当于“手动”的解析,这将让您决定如何解释坐标字段:@LosFrijoles谢谢您的链接!你试过什么?另外,您看过json.net中的linq到json吗?它允许使用JObject/JArray进行相当于“手动”的解析,这将让您决定如何解释坐标字段:@LosFrijoles谢谢您的链接!