如何在C#中序列化和反序列化geojson

时间:2018-05-31 05:07:25

标签: c# geojson geojson.net

尝试将对象反序列化为json,其中位置详细信息应转换为geojson格式。尝试使用geojson.net nuget包实现这一目标,但我无法实现相同的目标。 net中没有geojson的例子。 来自请求的我的对象:

public class Request
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Fence Fence { get; set; }
}
public class Fence
{
    public int Type { get; set; }
    public List<PValues> Values { get; set; }
}

public class PValues
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

我想将Request对象转换为我可以使用Newtonsoft反序列化实现的json,但在Request PValues内部必须转换为geojson polygon类型我如何在c#中执行此操作?

是GeoJson的新手,但当我阅读规范时,多边形规范如下所示

    {
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [80.227249, 12.901617],
            [80.227764, 12.888553],
            [80.232056, 12.89006],
            [80.233086, 12.900779],
            [80.227249, 12.901617]
          ]
        ]
      }
    }
  ]
}

因此,当我反序列化Request Class时,我需要上面的对象代替值。

4 个答案:

答案 0 :(得分:2)

请注意,不同的形状类型在几何图形中具有不同数量的嵌套数组。因此,我要指出的是,例如,需要一个与多面体不同的容器。您可能需要根据形状类型将public List<List<List<double>>> coordinates { get; set; }修改为public List<double> coordinates { get; set; }

答案 1 :(得分:1)

为了能够正确地序列化和反序列化你的类结构应该类似于:

public class Properties
{
}

public class Geometry
{
    public string type { get; set; }
    public List<List<List<double>>> coordinates { get; set; }
}

public class Feature
{
    public string type { get; set; }
    public Properties properties { get; set; }
    public Geometry geometry { get; set; }
}

public class RootObject
{
    public string type { get; set; }
    public List<Feature> features { get; set; }
}

答案 2 :(得分:1)

为确保您创建正确的类以映射json对象,请使用visual studio的“粘贴特殊”功能。你可以做的是,创建一个新的类,

  

编辑&gt;选择性粘贴&gt;将JSON粘贴为类

或者只是访问http://json2csharp.com/并查看你的json数据,然后点击生成按钮......这将为你提供你可以简单复制的课程。

仅供参考,VS Paste特殊生成以下类......

    class YourClassName
    {

        public class Rootobject
        {
            public string type { get; set; }
            public Feature[] features { get; set; }
        }

        public class Feature
        {
            public string type { get; set; }
            public Properties properties { get; set; }
            public Geometry geometry { get; set; }
        }

        public class Properties
        {
        }

        public class Geometry
        {
            public string type { get; set; }
            public float[][][] coordinates { get; set; }
        }

    }

http://json2csharp.com/将生成以下类...

public class Properties
{
}

public class Geometry
{
    public string type { get; set; }
    public List<List<List<double>>> coordinates { get; set; }
}

public class Feature
{
    public string type { get; set; }
    public Properties properties { get; set; }
    public Geometry geometry { get; set; }
}

public class RootObject
{
    public string type { get; set; }
    public List<Feature> features { get; set; }
}

两者都可以起作用但是给它们一个去看看哪个让你更容易使用。即使其中一个不起作用,您也可以记住这些选项以供将来参考。

答案 3 :(得分:0)

使用GeoJSON.Net库按如下所示修改模型:

public class Request
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Fence Fence { get; set; }
}
public class Fence
{
    public int Type { get; set; }
    public FeatureCollection Values { get; set; }
}

初始化请求对象:

var polygon = new Polygon(new List<LineString>
{
    new LineString(new List<IPosition>
    {
        new Position(20.236237,39.4116761),
        new Position(20.2363602,39.4115249),
        new Position(20.2365152,39.4110652),
        new Position(20.2364942,39.4104468),
        new Position(20.236237,39.4116761),
    })
});
var featureCollection = new FeatureCollection(new List<Feature>()
{
    new Feature(polygon)
});
var request = new Request()
{
    Id = 1,
    Name = "MyRequest",
    Fence = new Fence()
    {
        Type = 2,
        Values = featureCollection
    }
};

最后序列化对象:

var json = JsonConvert.SerializeObject(request);