【问题标题】:map-like serialization w/ data values as keys使用数据值作为键的类似地图的序列化
【发布时间】:2023-03-22 12:22:01
【问题描述】:

我需要序列化这个:

List<Event>

Event 类在哪里:

public class Event {
  public int id;
  public String foo;
  public String bar;
}

转换成这种形式的 JSON:

{
  "123":{"foo":"...","bar":"..."},
  "345":{"foo":"...","bar":"..."}
}

从 Event 中取出“id”属性并存储一个 Map 就可以了,但我需要支持重复的 ID。

是否可以在“id”属性上添加注释,以使 Jackson 将其视为键,将对象的其余部分视为关联值?

【问题讨论】:

  • 您必须更频繁地接受您的答案

标签: java json serialization jackson


【解决方案1】:

以您当前的 ID 结构为键,我不确定 JSON 规范中是否可能存在重复的 ID。也许如果你有带有 ID 的数组。我认为您需要重新评估所需的 JSON 输出。

【讨论】:

  • 我同意。 JSON 的结构并不理想。不幸的是,这超出了我的控制。服务器需要该特定格式。
【解决方案2】:

您可以使用IdentityHashMap,因此您可以使用包含相同值的不同字符串实例并得到以下结果:

{"1":{"foo":"foo1","bar":"bar"},"2":{"foo":"foo2.1","bar":"bar"},"3":{"foo":"foo2","bar":"baz"},"2":{"foo":"foo2","bar":"baz"}}

您可以执行此操作:

import java.io.IOException;
import java.util.Arrays;
import java.util.IdentityHashMap;
import java.util.List;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonTest {

    public static void main(final String[] args) throws JsonGenerationException, JsonMappingException, IOException {
        ObjectMapper om = new ObjectMapper();

        IdentityHashMap<String, Event> ihm = new IdentityHashMap<String, Event>();

        List<Event> list = Arrays.asList( //
                new Event(1, "foo1", "bar"), //
                new Event(2, "foo2", "baz"), //
                new Event(2, "foo2.1", "bar"), //
                new Event(3, "foo2", "baz") //
                );

        for (Event e : list) {
            ihm.put(String.valueOf(e.id), e);
        }

        System.out.println(om.writeValueAsString(ihm));
    }

    @JsonIgnoreProperties({ "id" })
    public static class Event {
        public int id;
        public String foo;
        public String bar;

        public Event(final int id, final String foo, final String bar) {
            super();
            this.id = id;
            this.foo = foo;
            this.bar = bar;
        }

    }

}

【讨论】:

  • 我最终只是“手动”进行 JSON 编码并使用 @JsonValue 注释该方法。这是在 Android 上运行的,所以我使用 Android 的静态 JSONOBject.quote() 方法来转义字符串。
  • 我可以看到@JsonValue 是如何工作的,但无需引用任何内容——只需返回具有“正确”结构的 POJO 或Map,序列化程序将递归处理它。
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2011-01-26
  • 2019-01-31
  • 2011-08-04
  • 2019-04-25
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多