Использование geo json в классе C# с ядром in ASP. NET и MongoDB - PullRequest
1 голос
/ 18 марта 2020

Я безуспешно пытаюсь создать MongoDB GeoJsonFeatureCollection из JSON в ASP. NET core.

(среда: драйвер MongoDB C# v2.10.2, ASP. NET core v3.1)

// a C# class which contains my geoJson features and intend to store in MongoDB
public class Route
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    public GeoJsonFeatureCollection<GeoJson2DCoordinates> Data { get; set; }
}

Затем в основном контроллере ASP. NET я хотел бы получить входящий JSON автоматически преобразуется в класс Route:

[HttpPost]
public ActionResult<Route> Create(Route route)  // FAILS HERE WITH NO PARAMETERLESS CONSTRUCTOR ERROR!
{
    _routeService.Create(route);  // send it off to MongoDB
    ...
}

Я понимаю, что это не удалось, поскольку GeoJsonFeatureCollection MongoDB не имеет конструктора без параметров, поэтому входящий JSON не может быть автоматически сопоставляется с C# Route class. Но я не могу найти очевидного обходного пути в этой ситуации.

Возможности, которые я рассмотрел:

  1. Пропустить попытку сопоставления с классом C# и просто работайте с BsonDocuments для всего. Кажется, что с этой опцией запросы становятся немного сложнее, и я теряю силу C#. Похоже, здесь стоит отстаивать здесь .

  2. Каким-то образом добавить пользовательский сериализатор для GeoJsonFeatureCollection . Я понятия не имею, как это сделать, но, возможно, в MongoDB предусмотрен соответствующий сериализатор:

    https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver/GeoJsonObjectModel/Serializers/GeoJsonFeatureCollectionSerializer.cs

  3. Использовать string для хранения geo Json Data в моем классе C# и выполнения преобразований вручную:

    public string Data { get; set; }

    вместо:

    public GeoJsonFeatureCollection<GeoJson2DCoordinates> Data { get; set; }

    , а затем вручную преобразовать строку в коллекцию GeoJsonGeometryCollection с помощью:

    var geoCollection = BsonSerializer.Deserialize<GeoJsonGeometryCollection<TCoordinates>>(json);

    , но это кажется уродливым, требуя дополнительных JSON сериализация в моем javascript коде и ручное преобразование в каждой конечной точке HTTP.

Что делать?

...