杰克逊自定义数字解析

时间:2014-03-05 16:19:13

标签: java json jackson

我希望杰克逊总是将数字解析为长或双。

我有一个类如下的类,带有相应的getter和setter:

public class Foo {
    private HashMap<String, ArrayList<HashMap<String, Object>>> tables;

    ...

}

有些Json看起来像这样:

{ "tables" : 
    { "table1" : 
        [
            { "t1Field1" : 0,
              "t1Field2" : "val2" 
            },
            { "t1Field1" : 1,
              "t1Field2" : "val4" 
            }
        ]
    }
}

Jackson会根据数字的大小将t1Field1的值解析为Integers / Longs和Floats / Doubles。但是我想要永远获得Longs和Doubles。

我几乎可以肯定我必须编写一个自定义反序列化程序或解析器来执行此操作,我已经查看了示例,但没有找到任何可行的方法。我只是想扩展现有的Jackson功能并覆盖数字的变化。我不想为Objects写一个完整的反序列化器。我只想做点什么:

public class CustomerNumberDeserializer extends SomethingFromCoreJackson {
    public Object deserialize() {
        Object num;
        num = super.deserialize();
        if (num instanceof Integer)
            return Long.valueOf(((Integer)num).intValue());
        return num;
    }
}

但我认为延伸的所有杰克逊课程都是最终的或抽象的,似乎需要一些额外的工作。我想要的是什么?

1 个答案:

答案 0 :(得分:3)

重新审视之后,我找到了我想扩展的课程。希望这有助于某人。

我创建了一个自定义反序列化器,如下所示:

/**
 * Custom deserializer for untyped objects that ensures integers are returned as longs
 */
public class ObjectDeserializer extends UntypedObjectDeserializer {

    private static final long serialVersionUID = 7764405880012867708L;

    @Override
    public Object deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException {

        Object out = super.deserialize(jp, ctxt);
        if (out instanceof Integer) {
            return Long.valueOf((Integer)out).longValue();
        }
        return out;
    }

    @Override
    public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt,
            TypeDeserializer typeDeserializer) throws IOException {

        Object out = super.deserializeWithType(jp, ctxt, typeDeserializer);
        if (out instanceof Integer) {
            return Long.valueOf((Integer)out).longValue();
        }
        return out;
    }
}

并配置我的对象映射器以使用它:

ObjectMapper om = new ObjectMapper();
SimpleModule mod = new SimpleModule().addDeserializer(Object.class, new ObjectDeserializer());
om.registerModule(mod);
相关问题