【问题标题】:Deserialize Json with inconstant field to POJO in Java将具有可变字段的Json反序列化为Java中的POJO
【发布时间】:2017-08-02 21:39:05
【问题描述】:

是否有可能在 Java 中创建 POJO 类 json可以反序列化吗?

{
    "name": "value",
    "random-value-01" : {
        "constant-field-00":"value_00",
        "constant-field-01":"value_01"
    },
    "random-value-02" : {
        "constant-field-00":"value_02",
        "constant-field-01":"value_03"
    },
    ...
    "random-value-XX" : {
        "constant-field-00":"value",
        "constant-field-01":"value"
     },
}

【问题讨论】:

  • 除非您愿意使用地图,否则不会。但我会质疑你为什么一开始就这样格式化它。

标签: java json jackson json-deserialization


【解决方案1】:

如果你所有的random-value-x JsonObjects 都具有相同的格式(即两个常量字段对于每个都是相同的),那么你总是可以有类似的东西:

class RandomValue {
    private final String constantField00;
    private final String constantField01;
    // ... Constructors, getters, etc.
}

class Pojo {
    private final String name;
    private final Map<String, RandomValue> randomValues;
    // ...
}

如果它们是有序的(即它们都相同random-value,如property-01property-02 等),那么您也可以将Map 设为List(或Set等)的RandomValue元素。


另一方面,如果 constant-fields 也是随机键,那么您可能会遇到类似以下情况:

class Pojo {
    private final String name;
    private final Map<String, Map<String, String>> additionalInfo;
    // ...
}

additionalInfoMap 的键是您的 random-value-xs,值是 MapString 键 (constant-field-0xs) 到 String 值 (values )。

【讨论】:

    【解决方案2】:

    这不是一个这样的答案,但可能会激起人们对一般主题的兴趣。

    对于那些对 JSON 的不同方法感兴趣的人,可以查看 ITU 的 ASN.1。可以把它想象成有点像 Google Protocol Buffers,但有一大堆不同的有线格式(包括 JSON、XML 和一大堆具有不同属性的二进制有线格式)。基本上,每种场合和目的都有一种有线格式。

    这有时会非常有用。如果您想在分布式系统中传输数据,并且该系统的某些部分是,例如低带宽无线电链路末端的微控制器上的 C,而其他部分是服务器上的 Java,那么您可以包含您的所有系统单一模式中的消息传递(充当单一事实点)。由此,您可以(取决于您使用的工具)在 C、C++、Java、C#,甚至 ADA、VHDL 中生成普通的旧对象。 Python 是一个明显的遗漏(有 Python 模块来执行代码优先 ASN1,这有点没抓住重点)。

    使用 JSON 作为有线格式是该标准中相对较新的补充,但一些商业工具支持它。对于那些真正需要它的人来说,它可能是一个非常有用的工具。

    从这个特定问题的角度来看,ASN.1 和支持 JSON 作为有线格式的工具没有用;您不能采用任意 JSON 并自动生成可以编译为类的模式。它在一个新项目中很有用,您希望其他语言/平台可以轻松地使用或生成您的数据。

    我一直在寻找使用 JSON 模式的体面的 C# 类生成器;不幸的是,最好的一个没有处理oneof。但是,我用于 ASN.1 的工具(具有等效的 CHOICE)确实会在 C#、Java、C/C++ 中生成完整的类。所以我处于这种有趣的情况,我有一个 ASN.1 模式,我(在这个特定项目中)编译为 C# 和 C,它处理 JSON、XML 和二进制线路格式。生成的类足够聪明,可以进行自己的验证——我不必通过 JSON 模式验证器传递 JSON。

    JSON 模式和 ASN.1 模式在可以放入规范的细节方面具有广泛的可比性。类似地,ASN.1 模式和 XSD XML 模式大体上是等价的(这两种语言之间甚至有官方的标准化翻译)。我看到使用 ASN.1 架构而不是 JSON 或 XSD 架构的好处是,这些工具(尤其是商业工具)似乎比通常与 JSON 和 XSD 架构相关的类生成器(例如 Microsoft 的 xsd. exe糟透了)。这对系统集成、维护、数据定义的敏捷性等产生了积极的积极影响。

    【讨论】:

      猜你喜欢
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 2020-12-10
      • 2018-05-31
      • 2014-06-27
      • 1970-01-01
      相关资源
      最近更新 更多