1

我有一个包含 NetTopologySuite 多边形的简单模型:

public class MyModel
{
    [Newtonsoft.Json.JsonConverter(typeof(MyPolygonConverter))]
    public NetTopologySuite.Geometries.Polygon poly { get; set; }
}

我已经使用 NetTopologySuite.IO.GeoJson 构建了一个自定义转换器:

public class MyPolygonConverter : JsonConverter<Polygon>
{
    public override void WriteJson(JsonWriter writer, Polygon value, JsonSerializer serializer)
    {
        var geoJsonSerializer = NetTopologySuite.IO.GeoJsonSerializer.Create();

        using var stringWriter = new StringWriter();
        using var jsonWriter = new JsonTextWriter(stringWriter);

        geoJsonSerializer.Serialize(jsonWriter, value);
        var geoJson = stringWriter.ToString();
        writer.WriteValue(geoJson);
    }
    ...
}

然后我创建一个模型对象并将其序列化:

var model = new MyModel
{
    poly = new Polygon(new LinearRing(new[]
    {
        new Coordinate(-100, 45),
        new Coordinate(-98, 45),
        new Coordinate(-99, 46),
        new Coordinate(-100, 45),
    }))
};

var geoJson = JsonConvert.SerializeObject(model, Formatting.None, 
    new JsonSerializerSettings
    {
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        NullValueHandling = NullValueHandling.Ignore
    });

我得到的包含 Polygon 作为转义的 GeoJson 字符串:

{
    "poly" : "{\"type\":\"Polygon\",\"coordinates\":[[[-100.0,45.0],[-98.0,45.0],[-99.0,46.0],[-100.0,45.0]]]}"
}

我想要的是多边形作为json,在json对象中:

{
    "poly" : {
        "type" : "Polygon",
        "coordinates" : [
            [
                [-100.0,45.0],
                [-98.0,45.0],
                [-99.0,46.0],
                [-100.0,45.0]
            ]
        ]
    }
}

我在想的是我根本不应该使用 JsonConverter ,而是别的东西。

但是什么?

4

1 回答 1

1

您可以使用JsonWriter.WriteRawValue(string)将原始 JSON 值直接写入 JSON 输出:

writer.WriteRawValue(geoJson);

话虽这么说,GeoJsonSerializer它是 Newtonsoft 自己的子类,JsonSerializer因此您可以将传入JsonWriter的内容传递给它的Serialize()方法:

public override void WriteJson(JsonWriter writer, Polygon value, JsonSerializer serializer)
{
    var geoJsonSerializer = NetTopologySuite.IO.GeoJsonSerializer.Create();
    geoJsonSerializer.Serialize(writer, value);
}

演示小提琴#1在这里

GeoJsonSerializer和基类的唯一区别NullValueHandling.Ignore是默认启用并添加了几个转换器,因此您也可以只使用此序列化程序来序列化整个模型,从而无需添加[Newtonsoft.Json.JsonConverter(typeof(MyPolygonConverter))]到模型中:

var serializer = NetTopologySuite.IO.GeoJsonSerializer.CreateDefault(
    new JsonSerializerSettings
    {
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        NullValueHandling = NullValueHandling.Ignore,
        Formatting = Formatting.Indented, // Or none, if you prefer
    });
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
using (var jsonWriter = new JsonTextWriter(sw))
    serializer.Serialize(jsonWriter, model);

var geoJson = sb.ToString();

演示小提琴#2在这里

于 2021-03-23T23:23:24.767 回答