如何使用Jackson流API序列化地图<integer,custom =“”object =“”>?</integer,>

时间:2011-03-18 09:36:45

标签: java json serialization jackson

说我有一个

        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()抛出一个异常,说它需要一个值。

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

1 个答案:

答案 0 :(得分:1)

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

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

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