所以我从服务器上取回一个对象,它看起来像这样:
{
"Status": {
"stuff":"stuff...";
"morestuff":"morestuff...";
};
"Data": { ... another object ... };
}
然而,当我取回这个对象时,我想将它反序列化为一个java类,它看起来像这样:
class Response
{
public StatusObject Status;
public String Data;
}
但是FlexJson将对象视为数据属性,然后尝试将HashMap强制转换为我的数据字符串。如果我得到一个以"null"作为Data属性的响应,那么一切都很好(因为您可以将null分配给String)。
我该如何告诉FlexJson不要试图用Data属性制作HashMap,而只将其作为String(即使它是JSON对象)?
现在我的反序列化代码行如下:
formattedResponse = new JSONDeserializer<network.Response>()
.use( "values", network.Response.class )
.deserialize(JSONString, network.Response.class);
谢谢你的帮助!
这很困难,因为它在开始将JSON绑定到对象之前,会将其解析为中间形式。因此,在开始询问对象应该使用什么类型之前,它已经被解析为HashMap。如果你想把它放进一个字符串,你必须把它转换回JSON。您可以使用ObjectFactory并将其绑定到对象中的路径上。在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);