FlexJSON исключить свойства при десериализации - PullRequest
1 голос
/ 06 марта 2012

Я получаю ответ JSON от веб-службы, но по разным причинам я не хочу десериализовать определенные свойства в конечном объекте ответа.Например, у меня есть:

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

    //getters & setters
}

Ответ JSON, который я получаю, имеет оба свойства, но после десериализации я не хочу, чтобы был установлен "bar".Причиной этого является то, что отправляемое им свойство является длинным, но наше свойство является строкой, поэтому при десериализации создается исключение IllegalArgumentException.

Другой вариант - анализировать JSON с помощью json-simple, удалитьсвойства, которые я хочу, преобразовать его обратно в JSON и передать его в десериализатор, но я хотел бы избежать этого, если это возможно, поскольку JSON довольно большой.

Есть ли способ сделать это с помощью ObjectFactoryвозможно?

1 Ответ

2 голосов
/ 07 марта 2012

Да, 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);
        }
   }
}

Вы даже можете зарегистрировать это как ObjectFactory по умолчанию для String, и он будет обрабатывать этот случай для любой строки, поступающей в десериализатор:

new JSONDeserializer().use( String.class, new EnhancedStringObjectFactory() ).deserialize( json, new SomeObject() );
...