1

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

{
    "Status": {
        "stuff":"stuff...";
        "morestuff":"morestuff...";
        };
    "Data": { ... another object ... };
}

但是,当我取回这个对象时,我想将它反序列化为一个如下所示的 java 类:

class Response
{
    public StatusObject Status;
    public String Data;
}

但是 FlexJson 将对象视为数据属性,然后尝试将 HashMap 强制转换为我的数据字符串。如果我收到以“null”作为 Data 属性的响应,则一切正常(因为您可以将 null 分配给字符串)。

我该如何告诉 FlexJson 不要尝试从 Data 属性中创建一个 HashMap 而只是将它作为一个字符串(即使它是一个 JSON 对象)?

现在我的反序列化代码行如下所示:

formattedResponse = new JSONDeserializer<network.Response>()
                    .use( "values", network.Response.class )
                    .deserialize(JSONString, network.Response.class);

感谢您的任何帮助!

4

2 回答 2

2

这很困难,因为它在开始将 JSON 绑定到对象之前将其解析为中间形式。所以在它开始询问对象应该使用什么类型之前,它已经被解析为一个 HashMap。如果你想把它变成一个字符串,你可以把它转回 JSON。您可以使用 ObjectFactory 并将其绑定到对象中的路径上。在 ObjectFactory 内部,它可以将其转换为字符串并将其绑定到那里的对象中。

new JSONDeserializer<...>()
    .use( "values", Response.class )
    .use( "values.Data", new JSONStringTransformer() )
    .deserialize( json, Response.class );
于 2012-02-20T20:46:37.247 回答
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);
于 2014-06-20T14:40:26.637 回答