所以我从一个看起来像这样的服务器回来了一个对象:
{
"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);
感谢您的帮助!
答案 0 :(得分:2)
这很困难,因为它在开始将JSON绑定到对象之前将JSON解析为中间形式。因此,在开始询问对象应该使用的类型之前,它已经被解析为HashMap。如果你想把它放到一个字符串中,你就可以把它变成JSON。您可以使用ObjectFactory并将其绑定到对象中的路径上。在ObjectFactory中,它可以将其转换为字符串并将其绑定到那里的对象。
new JSONDeserializer<...>()
.use( "values", Response.class )
.use( "values.Data", new JSONStringTransformer() )
.deserialize( json, Response.class );
答案 1 :(得分:0)
我遇到了同样愚蠢的问题,但是我开始编写自己的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);