如何在C#中序列化和反序列化geojson
How to serialize and deserialize geojson in C#
我正在尝试将对象反序列化为 json,其中位置详细信息应转换为 geojson 格式。试图使用 geojson.net nuget 包来实现这一点,但我无法达到同样的效果。网络中没有可用的 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 对象转换为 json,我可以使用 Newtonsoft 反序列化实现,但在 Request PValues 内部必须转换为 geojson 多边形类型我如何在 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.
时,我需要上面的对象来代替值
为了能够正确序列化和反序列化,您的 class 结构应该与此类似:
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; }
}
为确保您创建正确的 class 以映射到 json 对象,请使用 visual studio 的 'paste special' 功能。您可以做的是,创建一个新的 class、
Edit > Paste Special > Paste JSON as classes
或者只需访问 http://json2csharp.com/ 并将您的 json 数据放入其中,然后单击生成按钮...然后将为您提供 class,您可以简单地复制它。
仅供参考,VS 特殊粘贴生成如下 class...
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/会在下面生成class...
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; }
}
两者都可以,但试试看哪个更易用。即使其中一个不起作用,您也可以记住这些选项以备将来参考。
使用 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);
请注意,不同的形状类型在几何体中具有不同数量的嵌套数组。因此,我指出将需要一个与多面体不同的容器。您可能需要修改: public List<List<List<double>>> coordinates { get; set; }
到 public List<double> coordinates { get; set; }
取决于形状类型
我正在尝试将对象反序列化为 json,其中位置详细信息应转换为 geojson 格式。试图使用 geojson.net nuget 包来实现这一点,但我无法达到同样的效果。网络中没有可用的 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 对象转换为 json,我可以使用 Newtonsoft 反序列化实现,但在 Request PValues 内部必须转换为 geojson 多边形类型我如何在 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.
时,我需要上面的对象来代替值为了能够正确序列化和反序列化,您的 class 结构应该与此类似:
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; }
}
为确保您创建正确的 class 以映射到 json 对象,请使用 visual studio 的 'paste special' 功能。您可以做的是,创建一个新的 class、
Edit > Paste Special > Paste JSON as classes
或者只需访问 http://json2csharp.com/ 并将您的 json 数据放入其中,然后单击生成按钮...然后将为您提供 class,您可以简单地复制它。
仅供参考,VS 特殊粘贴生成如下 class...
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/会在下面生成class...
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; }
}
两者都可以,但试试看哪个更易用。即使其中一个不起作用,您也可以记住这些选项以备将来参考。
使用 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);
请注意,不同的形状类型在几何体中具有不同数量的嵌套数组。因此,我指出将需要一个与多面体不同的容器。您可能需要修改: public List<List<List<double>>> coordinates { get; set; }
到 public List<double> coordinates { get; set; }
取决于形状类型