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谢谢您的链接!