将JSON反序列化为多种数据类型地理空间系统

问题描述

在搜寻SO和Google的答案之后,我很茫然,所以希望有人可以帮助我!

我有一个使用第三方API数据的项目。数据是包含资产位置(经纬度)的JSON消息。

但是该API可以支持多边形和点(如下所示):

    {
    "geom": {
        "coordinates": [
            [
                [
                    0.07666021585464479,51.49331798632394
                ],[
                    0.07707864046096803,51.49337476490021
                ],[
                    0.07717519998550416,51.49315433003204
                ],[
                    0.07676750421524049,51.49309087131179
                ],[
                    0.07666021585464479,51.49331798632394
                ]
            ]
        ],"type": "Polygon"
    }
}

一个点看起来像这样:

{
    "geom": {
        "coordinates": [
            -0.00203667,51.51020028
        ],"type": "Point"
    }
}

我试图用以下方法模拟并反序列化:

public class Item
{
    [JsonProperty("geom")]
    public Geom Geom { get; set; }
}

public class Geom
{
    [JsonProperty("coordinates")]
    public double[] Coords { get; set; }

    [JsonProperty("type")]
    public string Type { get; set; }
}

并调用:

class Program
{
    static void Main(string[] args)
    {
        new Program();
    }

    public Program()
    {
        var single = "{\"geom\":{\"coordinates\":[-0.00203667,51.51020028],\"type\":\"Point\"}}";
        var s = JsonConvert.DeserializeObject<Item>(single);

        var poly = "{\"geom\":{\"coordinates\":[[[0.07666021585464479,51.49331798632394],[0.07707864046096803,51.49337476490021],[0.07717519998550416,51.49315433003204],[0.07676750421524049,51.49309087131179],[0.07666021585464479,51.49331798632394]]],\"type\":\"Polygon\"}}";
        var p = JsonConvert.DeserializeObject<Item>(poly);
    }
}

我对问题很了解,多边形字符串必须为double[][]。但是我似乎无法使两个字符串都使用相同的反序列化过程。

如果我将它们反序列化为object,则可以使用它,但是如果不进行任何转换,则无法在具体类中使用它。

我也看到过一些尝试,将“点”反序列化包装在try / catch中,并使用catch对“ poly”进行反序列化,但这似乎很简单,API中可能还有其他类型的坐标系

我正在使用Newtonsoft.Json和我研究了所有不同的方法,我得到的最接近的方法是具有不同的类变量,但是由于这是较大资产类的子类,因此我不这样做''不想一直到顶层都创建变体。

我也研究了自定义反序列化,但是我对它的理解还不足以解决这个问题。

如果有人认为可以使用另一个库解决此问题,也很乐意更改序列化程序。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)