如何在java中强制FlexJson将json对象反序列化为字符串?

时间:2012-02-19 21:32:49

标签: java string json flexjson

所以我从一个看起来像这样的服务器回来了一个对象:

{
    "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);

感谢您的帮助!

2 个答案:

答案 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);