Как заставить Flexjson в Java покинуть объект JSON в строке?
Вопрос
Итак, я получаю объект обратно от сервера, который выглядит так:
{
"Status": {
"stuff":"stuff...";
"morestuff":"morestuff...";
};
"Data": { ... another object ... };
}
Однако, когда я верну этот объект, я хочу покинуть его до класса Java, который выглядит так:
class Response
{
public StatusObject Status;
public String Data;
}
Но Flexjson видит объект как атрибут данных, а затем пытается поднять Hashmap в мою строку данных. Если я получаю ответ с «null» в качестве атрибута данных, все работает очень хорошо (поскольку вы можете назначить NULL строке).
Как я могу сказать Flexjson не пытаться сделать хэшмап из атрибута данных и просто взять его как строку (даже если это объект JSON)?
Прямо сейчас моя строка кода десериализации выглядит так:
formattedResponse = new JSONDeserializer<network.Response>()
.use( "values", network.Response.class )
.deserialize(JSONString, network.Response.class);
Спасибо за любую помощь!
Решение
Это сложно, потому что он анализирует JSON в промежуточную форму, прежде чем он начнет связывать его в объект. Таким образом, он уже проанализируется в хэшмап, прежде чем он начнет опросить объект для того, какие типы он должен использовать. Если вы хотите поместить его в строку, вы верните ее обратно в JSON. Вы можете сделать это, используя объект ObjectFactory и привязать его к пути в вашем объекте. Внутри объекта объекта он может затем превратить это в строку и привязать ее в объект там.
new JSONDeserializer<...>()
.use( "values", Response.class )
.use( "values.Data", new JSONStringTransformer() )
.deserialize( json, Response.class );
Другие советы
У меня была такая же глупая проблема, но я пошел вниз по дороге, чтобы написать свой собственный объект ObjectFactory, чтобы решить его.
package mypackage
import flexjson.JSONSerializer;
import flexjson.ObjectBinder;
import flexjson.ObjectFactory;
import java.lang.reflect.Type;
public class JSONStringFactory implements ObjectFactory {
@Override
public Object instantiate(ObjectBinder objectBinder, Object o, Type type, Class aClass) {
return new JSONSerializer().deepSerialize(o);
}
}
В клиентском коде вам просто нужно использовать фабрику:
MyDomainClass foo = new JSONDeserializer<MyDomainClass>()
.use("sillyJSONField", new JSONStringFactory())
.deserialize(requestJson, MyDomainClass.class);