1

我从 Web 服务接收 JSON 响应,但由于各种原因,我不想在最终响应对象中反序列化某些属性。例如我有:

public class Foo {
    private String bar;
    private int baz;

    //getters & setters
}

我返回的 JSON 响应具有这两个属性,但是在反序列化时我不想设置“bar”。原因是他们发送的属性是长的,但我们的是字符串,所以反序列化会抛出 IllegalArgumentException。

另一种选择是使用 json-simple 之类的东西解析 JSON,删除我想要的属性,将其转换回 JSON 并将其传递给反序列化器,但如果可能的话,我想避免这种情况,因为 JSON 非常大。

有没有办法用 ObjectFactory 做到这一点?

4

1 回答 1

2

是的,可以使用 ObjectFactory 来允许从 Long 到 String 的转换。只需在您的路径上注册 ObjectFactory,例如:

new JSONDeserializer().use("some.path.to.bar", new EnhancedStringObjectFactory() ).deserialize( json, new SomeObject() );



public class EnhancedStringObjectFactory implements ObjectFactory {
    public Object instantiate(ObjectBinder context, Object value, Type targetType, Class targetClass) {
        if( value instanceof String ) {
            return value;
        } else if( value instanceof Number ) {
            return ((Number)value).toString();
        } else {
           throw context.cannotConvertValueToTargetType(value, String.class);
        }
   }
}

您甚至可以将其注册为 String 的默认 ObjectFactory,它会为任何进入反序列化器的 String 处理这种情况:

new JSONDeserializer().use( String.class, new EnhancedStringObjectFactory() ).deserialize( json, new SomeObject() );
于 2012-03-07T19:01:09.427 回答