1

我需要序列化这个:

List<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”属性上添加注释以使杰克逊将其视为键,并将对象的其余部分视为关联值?

4

2 回答 2

0

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

于 2012-06-25T20:28:20.760 回答
0

您可以使用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;
        }

    }

}
于 2012-06-25T21:15:14.377 回答