【问题标题】:Is there a Json library that works with both array of objects and array of abstract classes? [closed]是否有一个同时适用于对象数组和抽象类数组的 Json 库? [关闭]
【发布时间】:2015-05-20 20:51:59
【问题描述】:

我需要从/向使用 XmlSerialization 属性装饰的 POCO 读取/写入 Json。此 POCO 是从 XSD 生成的。它广泛使用多态性、继承、对象、对象数组和抽象类数组。我已经尝试过看起来很有希望的JsonFx V2,但不幸的是,它运行得并不好,而且这个开源项目几年来几乎没有任何活动。

任何帮助表示赞赏。

更新 1:AFAIK Json.NET 不知道如何处理 XmlSerialization 属性。

更新 2:ServiceStack V3 似乎可以完成这项工作,但我至少有一个问题。

当属性是对象类型时添加一个 _type 成员,这很好。但是对象数组没有这样的信息。

考虑以下 c# 类:

[System.Xml.Serialization.XmlIncludeAttribute(typeof(adxppostalCode))]
public partial class ADXP : ST
{
  ...
}

[System.Xml.Serialization.XmlTypeAttribute(TypeName = "adxp.postalCode"]
public partial class adxppostalCode : ADXP
{
}

如果对象数组 (object[]) 包含 adxppostalCode 的实例,则序列化时 Json 中没有类型信息。因此,它在反序列化时将 ADXP 类的实例添加到数组中,而不是 adxppostalCode 的实例。

我希望这只是一个配置问题,因为除了这种行为之外,它运行良好。

Udapte 3:经过更多测试,Json.NET(至少版本 7.0.1 Beta 3)似乎支持属性并为对象数组(命名空间和库名称已被删除)。

"Items": [
              {
                "$type": "adxppostalCode, ....",
                "mediaType": "text/plain",
                "compressionSpecified": false,
                "integrityCheckAlgorithm": 0,
                "representation": 1,
                "Text": [
                  "69110"
                ]
              }
            ]

对于抽象类的数组,正确的类型被写入输出。在反序列化时,它尝试创建一个抽象的基本类型的实例,但它失败了。例如:

Json 片段:

"Items": [
          {
            "$type": "IVXB_TS, ...",
            "inclusive": true,
            "value": "20091231"
          }
        ]

无法创建 QTY 类型的实例。类型是接口或抽象类,不能实例化。

类层次结构:

[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public abstract partial class ANY : object, System.ComponentModel.INotifyPropertyChanged
{
}

[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public abstract partial class QTY : ANY
{
}

[System.Xml.Serialization.XmlIncludeAttribute(typeof(IVXB_TS))]
public partial class TS : QTY
{
}

public partial class IVXB_TS : TS
{
}

抽象类数组:

[System.Xml.Serialization.XmlElementAttribute("high", typeof(IVXB_TS))]
[System.Xml.Serialization.XmlElementAttribute("low", typeof(IVXB_TS))]
public QTY[] Items

【问题讨论】:

  • 这类问题在 SO 上是题外话。无论如何,看看Json.NET
  • @YuvalItzchakov 更新了我的问题。
  • 您具体指的是哪些属性? ServiceStack 支持 DataContract/DataMember 属性。 JSON.NET 有自己的属性。
  • 你想做什么?大多数 XmlSerialization 属性对 Json 来说毫无意义。 Json 中 没有 多态性或继承性,几乎所有东西都是对象数组或字典。
  • 序列化中的一个常见错误是试图使用单个模型来解决多个问题。每当序列化通用模型变得棘手时,您的 立即 响应应该是:为这种序列化格式创建一个 纯粹 存在的 DTO - 包括特定所需的结构和属性序列化器。通过简单地创建第二个 DTO 模型并根据需要在它们之间进行映射,您将节省 很多 时间和理智。

标签: .net json json.net servicestack-text


【解决方案1】:

Json.NET 7.0.1 Beta 3 实际上能够处理所有这些情况。

关键的一点是反序列化器必须像序列化一样配置为类型处理。我错误地认为 json 文件中可用的类型信息会被自动使用。

可能早期版本也会这样做。

【讨论】:

    猜你喜欢
    • 2019-07-29
    • 2020-04-10
    • 2012-02-14
    • 2014-10-15
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多