Как сериализовать и десериализовать геойсон в C # - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь десериализовать объект в json, где сведения о местоположении должны быть преобразованы в формат геоджон.Попытался добиться этого с помощью пакета nuget geojson.net, но не смог добиться того же.В сети нет примеров, доступных для 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; }
}

Я хочу преобразовать объект запроса в json, который я могу достичь с помощью десериализации Newtonsoft, но внутри значений 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]
          ]
        ]
      }
    }
  ]
}

Так что вместо значений мне нужен вышеуказанный объект, когда я десериализую класс запроса.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Чтобы убедиться, что вы создаете правильный класс для сопоставления с объектом json, используйте функцию «вставить специальную» Visual Studio.Что вы можете сделать с этим, создать новый класс,

Редактировать> Вставить специальный> Вставить JSON как классы

Или просто посетите http://json2csharp.com/ изабросьте ваши данные в формате json и нажмите кнопку «генерировать» ... что даст вам класс, который вы можете просто скопировать.

К вашему сведению, VS Специальная вставка генерирует ниже класса ...

    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/ будет генерировать ниже класса ...

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; }
}

Оба могут работать, но дать им возможность посмотреть, что дает вам больше простоты использования.Даже один из них не работает, вы можете запомнить эти параметры для дальнейшего использования.

0 голосов
/ 07 октября 2018

Используя библиотеку 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);
0 голосов
/ 31 мая 2018

Для правильной сериализации и десериализации структура вашего класса должна быть похожа на эту:

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; }
}
...