【问题标题】:How to force FlexJson in java to deserialize a json object to a string?java - 如何强制Java中的FlexJson将json对象反序列化为字符串?
【发布时间】:2012-02-19 21:32:49
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

  • 所以你必须告诉它3次? Greeeaaaat

标签: java string json flexjson


【解决方案1】:

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

new JSONDeserializer<...>()
    .use( "values", Response.class )
    .use( "values.Data", new JSONStringTransformer() )
    .deserialize( json, Response.class );

【讨论】:

  • 那么 JSONStringTransformer 应该是我制作的自定义 ObjectFactory 吗?我将看看如何制作自定义对象工厂。谢谢您的帮助!默认的 StringTransformer 没有办法工作吗?即使我尝试使用它,我也会收到此错误: JSONDeserializer 类型中的方法 use(String, ClassLocator) 不适用于参数 (String, StringTransformer)
  • No StringTransformer 不起作用,因为 Transformer 用于将对象转换为 JSON。您需要将 JSON 转换为 ObjectFactory 的东西。但是将事物转换为字符串的类不知道如何将 HashMap 转换为字符串。这是一种非常奇怪的情况,您不想将一部分 JSON 作为对象,而是使用 JSON 部分字符串。
  • 啊,好吧,那么我正在做的事情是相当倒退的。我试图创建一个自定义对象工厂,但它看起来很讨厌所以我最终这样做了: int dataIndex = JSON.indexOf(dataIdentifier); formattedResponse.Data = JSON.substring(dataIndex + dataIdentifier.length() - 2, JSON.length() - 1);其中 dataIdentifier 为 = "\"},\"Data\":{\"";这很讨厌,但它确实有效。
  • 好吧,即使您可以将 HashMap 转换回 JSON。我打算建议只是对它进行子串化,因为这样会更有效率。
  • 是的,这个解决方案现在可以正常工作。出于好奇,如果对象中有对象,flexjson会做hashmaps的hashmaps吗?
【解决方案2】:

我有同样愚蠢的问题,但我走上了编写自己的 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);

【讨论】:

    猜你喜欢
    • 2020-02-03
    • 2018-11-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多