【问题标题】:How to serialize a map<Integer, Custom object> with Jackson streaming API?如何使用 Jackson 流 API 序列化 map<Integer, Custom object>?
【发布时间】:2026-02-15 23:25:01
【问题描述】:

说我有一个

        class Person {
         ArrayList<MyOtherObject> lstObjects;
...
       }

然后

Map<Integer, Person> personMap

想要使用 Jackson Streaming API 序列化该地图?

JsonGenerator g =...;

g.writeArrayFieldStart("PersonMap");

    if (personMap != null) {
            Iterator<Map.Entry<Integer, Person>> iter = personMap.entrySet().iterator();
            while (iter.hasNext()) {

                Map.Entry<Integer, Person> pairs = iter.next();
                Integer key = (Integer) pairs.getKey();
                Person person = (Person) pairs.getValue();
                g.writeNumber(key.intValue());

                person.saveToFileRaw(g); // Write the object

            }
        } 
        g.writeEndArray(); // PersonMap

person.saveToFileRaw 看起来像

try {
            g.writeStartObject();

            g.writeObjectFieldStart("Inf");
            if (lstInfo != null) {
                for (PersonInfo info: lstInfo)
                    info.saveToFileRaw(g); // Write another object
            } 
            g.writeEndObject();

            String s = PersonType.token(type);
            g.writeStringField("Tp", s);
            g.writeStringField("Add", address);

所以问题是:如何编写自定义对象的数组/映射? person.saveToFileRaw 中的 g.writeStartObject() 抛出异常,表示它需要一个值。

任何想法如何做到这一点?

【问题讨论】:

  • 您要创建什么 JSON 结构?从代码上看不是很清楚。
  • 我只是想以某种方式将它保存到文件中,但我试图用键/对象或类似的东西创建一个数组。 PersonMap:{[key, Person], [key, Person]} 伪代码。
  • 如果您只想将对象保存到文件中,则无需使用 Streaming API:通过 ObjectMapper 进行数据绑定就可以了。比如:new ObjectMapper().writeValue(new File("output.json"), myObject);

标签: java json serialization jackson


【解决方案1】:

如果您从 JsonGenerator 调用中获得异常,则说明您正在尝试创建无效的 JSON 结构;无法解析的东西。

我在代码中看到的一个问题是,您首先调用“g.writeObjectFieldStart("Inf")”,然后在循环中尝试调用以“g.writeStartObject”开头的方法——本质上是尝试写入 start-object标记“{”两次。

您也可以单独调用“writeFieldName”(而不是 writeObjectFieldStart()),您可能需要这样做。或者您可能需要为 PersonInfo 条目执行 writeStartArray(() / writeEndArray();这取决于您想要的确切输出。

【讨论】: