Как десериализовать дополнительные свойства, присутствующие в типе, для которого уже существует преобразователь?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как десериализовать дополнительные свойства, присутствующие в типе, для которого уже существует преобразователь?

Сообщение Anonymous »

Я пытаюсь десериализовать geojson FeatureCollection. API, который я запрашиваю, возвращает эту коллекцию функций с дополнительными свойствами типа. Свойства используются для разбиения на страницы на основе курсора.
FeatureCollection десериализуется с помощью NetTopologySuite.IO.GeoJsonConverterFactory. Это прекрасно работает для первой страницы результатов.
Проблема в том, что класс NTS (NetTopologySuite) FeatureCollection не имеет этих свойств разбиения на страницы, и поэтому они не десериализуются.< /p>
Искомый API:
https://api.pdok.nl/lv/bgt/ogc/v1/api
Некоторые образец, содержащий свойство "links" с необходимой ссылкой на страницы.
https://api.pdok.nl/lv/bgt/ogc/v1/colle ... nd/items?f =json&limit=1
Я дважды пытался десериализовать ответ API в формате json. Один раз как коллекцию объектов, один раз как пользовательский poco, содержащий только дополнительные свойства.

Код: Выделить всё

//Link.cs
public class Link
{
public string Rel { get; set; }
public string Type { get; set; }
public string Title { get; set; }
public string Href { get; set; }
}

//FeatureCollectionResponse.cs
public class FeatureCollectionResponse
{
public Link[] Links { get; set; }
public int NumberReturned { get; set; }
}

//Program.cs
using System.Text.Json;
using NetTopologySuite.Features;
using NetTopologySuite.IO.Converters;

var json = """
{
"type": "FeatureCollection",
"timeStamp": "2024-05-23T06:59:03Z",
"links": [
{
"rel": "self",
"title": "This document as GeoJSON",
"type": "application/geo+json",
"href": "https://api.pdok.nl/lv/bgt/ogc/v1/collections/pand/items?f=json&limit=1"
},
{
"rel": "alternate",
"title": "This document as JSON-FG",
"type": "application/vnd.ogc.fg+json",
"href": "https://api.pdok.nl/lv/bgt/ogc/v1/collections/pand/items?f=jsonfg&limit=1"
},
{
"rel": "alternate",
"title": "This document as HTML",
"type": "text/html",
"href": "https://api.pdok.nl/lv/bgt/ogc/v1/collections/pand/items?f=html&limit=1"
},
{
"rel": "next",
"title": "Next page",
"type": "application/geo+json",
"href": "https://api.pdok.nl/lv/bgt/ogc/v1/collections/pand/items?cursor=Ag%7CNAynHA&f=json&limit=1"
}
],
"features": [
{
"type": "Feature",
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[5.42284076748324, 51.3047942505348],
[5.42284280810938, 51.3047814589294],
[5.42280900677049, 51.3047793389887],
[5.42281420113966, 51.3047468161292],
[5.42283456510663, 51.3047480952593],
[5.42284800245476, 51.3047489360685],
[5.42287536474456, 51.3047506534869],
[5.42286609340301, 51.3047958427393],
[5.42284076748324, 51.3047942505348]
]
]
]
},
"properties": {
"bag_pnd": "0858100000004395",
"bronhouder": "G0858",
"creation_date": "2014/01/14 00:00:00",
"eind_registratie": null,
"in_onderzoek": null,
"in_onderzoek_leeg": "geenWaarde",
"lokaal_id": "G0858.0000b367299f47c9b4b5235d3dd44937",
"lv_publicatiedatum": "2014/08/10 16:22:23",
"plus_status": null,
"plus_status_codespace": "http://www.geostandaarden.nl/imgeo/def/2.1#VoidReasonValue",
"plus_status_leeg": "geenWaarde",
"relatieve_hoogteligging": 0,
"status": "bestaand",
"status_codespace": "http://www.geostandaarden.nl/imgeo/def/2.1#Status",
"status_leeg": null,
"termination_date": null,
"termination_date_leeg": "geenWaarde",
"tijdstip_registratie": "2014/01/20 13:14:55",
"version": "3fffbd13-0b2d-9c60-87e4-77170c259f2e"
},
"id": 1
}
],
"numberReturned": 1
}
""";

var serializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web);
serializerOptions.Converters.Add(new GeoJsonConverterFactory());

var featureCollection = JsonSerializer.Deserialize(json, serializerOptions);
var paginationInformation = JsonSerializer.Deserialize(json);

if (featureCollection is not null)
{
Console.WriteLine("featurecollection was deserialized: "  + featureCollection[0].Attributes["bag_pnd"]);
}
else{
Console.WriteLine("feature collection not deserialized");
}

if (paginationInformation?.NumberReturned == 1)
{
Console.WriteLine("paginationInformation was deserialized");
}
else{
Console.WriteLine("paginationInformation was not deserialized");
}

Коллекция объектов заполнена правильно, но все свойства информации о разбивке на страницы имеют значение NULL.
Как правильно извлечь эти дополнительные свойства? Возможно, класс-оболочка. Но как это будет выглядеть?
Могу ли я создать JsonConverter для FeatureCollection, который обрабатывает эти дополнения, и делегировать остальную часть типа десериализатору NTS?

Подробнее здесь: https://stackoverflow.com/questions/785 ... -a-convert
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»