尝试返回一些非常简单的GeoJSON数据。我找到了NetTopologySuite,并设置了一个简单的FeaturesCollection,并试图将其序列化为GeoJson字符串,只是为了得到以下错误:
"检测到属性的自引用循环' CoordinateValue'同 类型' GeoAPI.Geometries.Coordinate'。路径 '特点[0] .Geometry.Coordinates [0]'"
查看类标题,Point使用Coordinate,它具有Coordinate属性,因此我可以看到为什么会有循环引用。问题是,大多数(如果不是全部)几何图形似乎都使用了Point,这样就无法对任何内容进行序列化......除非我遗漏了某些东西。
这是一个错误还是我错过了什么?
仅使用Point测试并得到相同的错误,所以这里的代码是:
using NTS = NetTopologySuite;
var ret = new NTS.Geometries.Point(42.9074, -78.7911);
var jsonSerializer = NTS.IO.GeoJsonSerializer.Create();
var sw = new System.IO.StringWriter();
jsonSerializer.Serialize(sw, ret);
var json = sw.ToString();
答案 0 :(得分:4)
使用GeoJsonSerializer
类的默认构造函数:
var jsonSerializer = new NetTopologySuite.IO.GeoJsonSerializer();
附加CoordinateConverter
以防止出现此问题。
答案 1 :(得分:0)
在您已经序列化之后,您可以使用:
,而不是返回Json return Content(sw.ToString, "application/Json");
答案 2 :(得分:0)
聚会晚了一点,但这是我的看法:
您可以轻松地使Point
与您当前的Json Serializer设置兼容。
[DataContract]
public class GeoLocation : NetTopologySuite.Geometries.Point
{
const int GoogleMapsSRID = 4326 ;
public GeoLocation(double latitude, double longitude)
: base(x: longitude, y: latitude) =>
base.SRID = GoogleMapsSRID;
[DataMember]
public double Longitude => base.X;
[DataMember]
public double Latitude => base.Y;
}
DataContract
和DataMember
是关键:
new GeoLocation(42.9074, -78.7911).ToJson() => {"longitude":42.9074,"latitude":-78.7911}