试图返回一些非常简单的GeoJSON数据。我找到了NetTopologySuite,并设置了一个简单的FeaturesCollection,并尝试将其序列化为GeoJson字符串,但只得到以下错误:
为属性'CoordinateValue‘检测到的自引用循环,类型为’detected .Geometries.Schedate‘. Path’Features.Getimey.Traates‘。
在查看类标题时,Point使用了坐标,它有一个坐标属性,所以我可以看到为什么会有一个循环引用。问题是,大多数(如果不是全部)几何图形似乎都使用了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();发布于 2014-11-05 22:02:15
更新
GeoJsonSerializer已经转移到NetTopologySuite.IO.GeoJSON,现在有了自己的静态Create()方法:
/工厂方法,用于在内部创建(Geo)JsonSerializer /一个公开的新静态JsonSerializer创建(){返回CreateDefault();}
对直接构造函数的使用已被废弃:
过时(“使用GeoJsonSerializer.Create.()函数”)公共GeoJsonSerializer():this(Wgs84Factory) {}
问题中的代码现在应该像预期的那样工作。
原始答案
使用GeoJsonSerializer类的默认构造函数:
var jsonSerializer = new NetTopologySuite.IO.GeoJsonSerializer();它附加了一个防止问题的CoordinateConverter。
GeoJsonSerializer实际上没有静态的Create()方法,因此您将回到基类的JsonSerializer.Create()上。实际上,以下情况会导致编译器错误:
GeoJsonSerializer jsonSerializer = NTS.IO.GeoJsonSerializer.Create();发布于 2015-12-16 17:46:21
不必在序列化之后返回Json,您可以使用:
return Content(sw.ToString, "application/Json");发布于 2020-03-09 04:24:33
聚会有点晚了,但我的看法是:您可以轻松地使Point与您当前的Json序列化程序设置兼容。
[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}https://stackoverflow.com/questions/26763564
复制相似问题