Фон
Я хочу предоставить JsonSchema из моего приложения. NET Core 3, а также другие объекты, сериализованные в JSON. Поскольку Manatee. Json часто обновляется и обеспечивает хорошую поддержку JsonSchema, они - мой предпочтительный выбор. В то же время. NET Core 3 обеспечивает отличную поддержку для возврата объектов с магией c, которые преобразуют их в JSON документы.
Пример:
public ActionResult<MyFancyClass> MyFancyAction()
{
return new MyFancyClass {
Property1 = "property 1 content",
Property2 = "property 2 content",
};
}
Вывод:
{
"Property1": "property 1 content",
"Property2": "property 2 content"
}
Проблема
. NET Core 3 имеет внутреннюю поддержку JSON с его System.Text.Json
, который используется в предыдущем примере. Если я попытаюсь сериализовать Manatee.Json.Schema.JsonSchema
, то его внутренняя структура сериализуется, а не сама схема json.
Пример:
public ActionResult<MyFancyClass2> MyFancyAction2()
{
return new MyFancyClass2 {
Property1 = "property 1 content",
Property1Schema = new JsonSchema()
.Type(JsonSchemaType.String)
};
}
Вывод:
{
"Property1": "property 1 content",
"Property1Schema": [{
"name":"type",
"supportedVersions":15,
"validationSequence":1,
"vocabulary": {
"id":"https://json-schema.org/draft/2019-09/vocab/validation",
"metaSchemaId":"https://json-schema.org/draft/2019-09/meta/validation"
}
}]
}
Я ожидаю, что:
{
"Property1": "property 1 content",
"Property1Schema": {
"type": "string",
}
}
Manatee.Json.JsonValue
также имеют конфликтующую внутреннюю структуру, где System.Text.Json.JsonSerializer
не может правильно получить доступ к внутренним методам get, и я получаю, например, это сообщение об исключении:
Cannot access value of type Object as type Boolean.
Discovery
Manatee.Json.Schema.JsonSchema
имеет метод .ToJson()
, который можно использовать для получения правильной схемы json в виде JsonValue
, но затем я получаю проблему, с которой я только что упомянул сериализация Manatee.Json.JsonValue
.
Вопрос
Кто-нибудь знает способ включения System.Text.Json
для сериализации Manatee.Json
структур?
Sidemark
Другой путь вперед - заменить System.Text.Json
в целом (взгляните на этот вопрос ).