gpt4 book ai didi

json - 使用 ServiceStack.Text 序列化多态集合

转载 作者:行者123 更新时间:2023-12-05 00:31:50 24 4
gpt4 key购买 nike

我们正在从 Json.NET 切换到 ServiceStack.Text,我遇到了多态集合的序列化问题。

在 JSON.NET 中,我曾经创建一个自定义 JsonCreationConverter 并覆盖 Create() 方法以选择我想要创建的类型 - 如下所述:

http://dotnetbyexample.blogspot.co.uk/2012/02/json-deserialization-with-jsonnet-class.html

有问题的集合是 List<ItemBase>其中可以包含 FlightItemCarHireItem对象。

这是我的 JSON.NET 的 Create() 方法版本:

protected override ItemBase Create(Type objectType, JObject jsonObject)
{
var itemType = jsonObject["Type"].ToString();
switch (itemType)
{
case "flight":
return new FlightItem();
case "carhire":
return new CarHireItem();
default:
return null;
}
}

ServiceStack 可以实现吗?

ServiceStack 中用于多态集合的序列化和反序列化有效,但是,它将对象类型附加到 JSON 输出,例如
"__type" : "TestProject.Model.FlightItem, TestProject"

这意味着我需要在发布 JSON 时提供类型,而且我不太热衷于让 API 调用中的任何人都可以看到 .NET 类型。

有什么建议?如果有可能以不同的方式做到这一点,你能指出一些例子吗?

最佳答案

首先,Interfaces or abstract types in DTOs are a bad idea .

您现在处于一个奇怪的位置,您试图在 DTO 中支持多态类型,但又不想提供 JSON Serializer 特定的信息?您需要定制代码来支持多态 DTO 的原因是因为无法根据连线格式判断应该使用哪种具体类型,因此 ServiceStack 发出 __类型 为此目的的属性(property)。

为了避免这些黑客行为,并让它在所有 JSON 序列化器中同样有效,您最好将多态类型“扁平化”为单个“扁平”DTO,然后通过网络发送它。回到 C# 后,您可以使用代码将其投影为理想的类型。

ServiceStack 确实提供了一些 JsConfig<ItemBase>.RawDeserializeFn这会让你做类似的事情,见 CustomSerializerTests for an example .还有JsConfig<ItemBase>.OnDeserializedFn Hook 可能会有所帮助,但这取决于 ItemBase包含两种具体类型的完整属性列表。

关于json - 使用 ServiceStack.Text 序列化多态集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14283621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com