使用Java中的POJO将带有不稳定字段的Json反序列化

时间:2017-08-02 21:39:05

标签: java json jackson json-deserialization

是否有可能在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"
     },
}

2 个答案:

答案 0 :(得分: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-field也是随机密钥,那么您可能会更喜欢以下内容:

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

additionalInfo Map的关键字是random-value-x个,MapString个关键字constant-field-0x s)String值(value s)。

答案 1 :(得分:0)

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

对于那些对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糟透了)。这对系统集成,维护,敏捷数据定义等有着积极的好处。