将 System.Text.Json 替换为 Manatee.Json 以在 .NET Core 3 中进行序列化
Replacing System.Text.Json with Manatee.Json for serialization in .NET Core 3
背景
我想从我的 .NET Core 3 应用程序中提供一些 JsonSchema,以及序列化为 JSON 的其他对象。由于 Manatee.Json 经常更新并且对 JsonSchema 提供了良好的支持,因此它们是我的首选。同时,.NET Core 3 为返回对象提供了出色的支持,可以将对象转换为 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.
发现
Manatee.Json.Schema.JsonSchema
有一个 .ToJson()
方法,可用于获取正确的 json 模式作为 JsonValue
,但随后我遇到了我刚才提到的序列化问题 Manatee.Json.JsonValue
.
问题
有谁知道将 .NET Core 3 中的默认序列化从使用 System.Text.Json
更改为使用 Manatee.Json
的方法?
侧标
另一种方法是启用 System.Text.Json
序列化 Manatee.Json
结构(看看 this question)。
你走运了!我刚刚发布了schema-successor到Manatee.Json:JsonSchema.Net!它完全支持 2019-09 草案 6,基于 100% System.Text.Json
,而且速度快得离谱!
希望这对您有所帮助。
(不知道为什么我没有收到有关 Manatee.Json
标签的电子邮件。抱歉,我花了这么长时间才找到它。)
背景
我想从我的 .NET Core 3 应用程序中提供一些 JsonSchema,以及序列化为 JSON 的其他对象。由于 Manatee.Json 经常更新并且对 JsonSchema 提供了良好的支持,因此它们是我的首选。同时,.NET Core 3 为返回对象提供了出色的支持,可以将对象转换为 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.
发现
Manatee.Json.Schema.JsonSchema
有一个 .ToJson()
方法,可用于获取正确的 json 模式作为 JsonValue
,但随后我遇到了我刚才提到的序列化问题 Manatee.Json.JsonValue
.
问题
有谁知道将 .NET Core 3 中的默认序列化从使用 System.Text.Json
更改为使用 Manatee.Json
的方法?
侧标
另一种方法是启用 System.Text.Json
序列化 Manatee.Json
结构(看看 this question)。
你走运了!我刚刚发布了schema-successor到Manatee.Json:JsonSchema.Net!它完全支持 2019-09 草案 6,基于 100% System.Text.Json
,而且速度快得离谱!
希望这对您有所帮助。
(不知道为什么我没有收到有关 Manatee.Json
标签的电子邮件。抱歉,我花了这么长时间才找到它。)