Я безуспешно пытаюсь создать 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. Но я не могу найти очевидного обходного пути в этой ситуации.
Возможности, которые я рассмотрел:
Пропустить попытку сопоставления с классом C# и просто работайте с BsonDocuments для всего. Кажется, что с этой опцией запросы становятся немного сложнее, и я теряю силу C#. Похоже, здесь стоит отстаивать здесь .
Каким-то образом добавить пользовательский сериализатор для GeoJsonFeatureCollection . Я понятия не имею, как это сделать, но, возможно, в MongoDB предусмотрен соответствующий сериализатор:
https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver/GeoJsonObjectModel/Serializers/GeoJsonFeatureCollectionSerializer.cs
Использовать 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.
Что делать?