【问题标题】:Serialize flat object to nested JSON structure将平面对象序列化为嵌套的 JSON 结构
【发布时间】:2020-03-20 08:45:28
【问题描述】:

挑战

我有一个完全扁平的 (POGO/POJO) 对象,我需要将其序列化为嵌套的 JSON 结构。最好使用 Jackson 注释和/或自定义序列化器

我只对从对象序列化到 JSON 感兴趣,不需要反序列化。

示例

我想转这门课:

class SomeClass {
    @JsonProperty('Business.Name')
    BigDecimal prop1 = 42.0
    @JsonProperty('Other.Nested.Business.Name')
    BigDecimal prop2 = 3.14
}

进入这个 JSON:

{
  "Other" : {
    "Nested.Business.Name" : 3.14
  },
  "Business.Name" : 42.0
}

第 22 条渔获

类的代码是自动生成的。我对这一代人有一些影响,但它需要完全平坦!

任何帮助将不胜感激!

其他信息

我已经尝试过制作自定义序列化程序,但未能编写嵌套结构。

class SomeClassSerializer extends StdSerializer<SomeClass> {
    void serialize(SomeClass value, JsonGenerator jgen, SerializerProvider provider) {
        jgen.writeStartObject()
        jgen.writeNumberField("Business.Name", value.prop1)
        //how to write the nested structure
        jgen.writeEndObject()
    }
    ....
}

【问题讨论】:

    标签: java json groovy jackson


    【解决方案1】:

    在哪里说 // 如何编写嵌套结构,你有没有尝试过类似的东西

       jgen.writeObjectFieldStart("Other")
       jgen.writeNumberField("Nested.BusinessName", value.prop2)
       jgen.writeEndObject()
    

    【讨论】:

    • 我刚刚拥有并且它有效!但是如果字段和整个子结构只包含空值,我需要删除它,这显然是一个问题:stackoverflow.com/questions/60449681/…
    • @brianjohnsen 用 ifs 包裹写作?
    • @cfrick ifs 是什么?
    • if (value.props2) { ... }
    • 当然是 if 语句,我把它看成一个首字母缩略词 :-) 不幸的是,这太麻烦了,因为嵌套结构可以包含 20-30 个字段,如果没有值,则周围的结构一定不能也有。
    【解决方案2】:

    您可以只编写自定义序列化程序:JsonSerializer&lt;SomeClass&gt; 来定义所有规则。

    【讨论】:

    • 我更新了自定义序列化尝试失败的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多