杰克逊序列化:包裹领域

编程入门 行业动态 更新时间:2024-10-26 14:30:00
本文介绍了杰克逊序列化:包裹领域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

当我们打开嵌套对象并将其字段写入主对象时,有一个众所周知的情况,我需要做一个反向任务。

There is a good known case when we unwrap nested object and write its fields into the main object, and I need to make an inverse task.

我有一个POJO:

class A { private String id = "id1"; @JsonWrap("properties") private String property1 = "..."; @JsonWrap("properties") private String property2 = "..."; // getters and setters }

默认序列化器将按预期生产

Default serializer will produce as expected

{ "id": "id1", "property1": "...", "property2": "..." }

但是,我的JSON应该符合某些规范,为此,我需要在 property1 和 property2 内包装属性包装器。因此结果应如下所示:

But, my JSON should match some specification, and to do that, I need to wrap property1 and property2 inside properties wrapper. So the result should looks like:

{ "id": "id1", "properties": { "property1": "...", "property2": "..." } }

我不想改变POJO的结构,所以我看到了3种可能的方式:

I don't want to change the structure of the POJO so I see 3 possible ways:

  • 编写自定义序列化程序。但是在我看来,编写这样的序列化器需要花费更多精力然后手工序列化对象。
  • 创建代理Java对象,它将反映JSON的正确结构,并序列化这样的代理。
  • 生成后修改JSON。 (我担心重读和重写JSON会有很大的开销)。
  • 有人制作这样的Serializer或者知道吗使用我需要的结构生成JSON的另一个选项?

    Does anybody make such Serializer or maybe know another options to generate JSON with the structure I need?

    对于自定义序列化程序我想重用标准BeanSerializer,I不想手动写出所有字段:

    For custom serializer I want to reuse standard BeanSerializer, I dont want to write out all fields manually:

  • 隐藏带注释的字段。
  • 写出bean,没有带注释的字段,但不要关闭对象。 (不要调用 jgen.writeEndObject(); )
  • 写出包装好的字段。
  • 关闭对象。
  • Hide annotated fields.
  • Write out bean, without annotated fields, but don't close object. (Don't call jgen.writeEndObject();)
  • Write out wrapped fields.
  • Close object.
  • 推荐答案

    您需要更改模型。

    @JsonSerialize(using = ASerializer.class) class A { private String id; private String property1; private String property2; // getters and setters public static class ASerializer extends JsonSerializer<A> { @Override public void serialize(A value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeStringField("id", value.getId()); jgen.writeObjectFieldStart("properties"); jgen.writeStringField("property1", value.getProperty1()); jgen.writeStringField("property2", value.getProperty2()); jgen.writeEndObject(); jgen.writeEndObject(); } } }

    在主要运行:

    A a = new A(); a.setId("id1"); a.setProperty1("..."); a.setProperty2("..."); ObjectMapper mapper = new ObjectMapper(); ObjectWriter writer = mapper.writer(); String json = writer.writeValueAsString(a); System.out.println(json);

    输出:

    {"id":"id1","properties":{"property1":"...","property2":"..."}}

    更多推荐

    杰克逊序列化:包裹领域

    本文发布于:2023-08-01 12:25:12,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1268302.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:杰克逊   包裹   领域   序列化

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!