【问题标题】:GSON: How to decode from json to Model ignoring an Object?GSON:如何从 json 解码为忽略对象的模型?
【发布时间】:2019-11-27 23:30:07
【问题描述】:

我有一个模型,包含在一个主要的 Manager 类中,它有一些变量,例如 name,但也有一个名为 data 的大对象。对于特殊情况,我想使用 Gson 从 json 传递到模型,但忽略 json 的 data 对象(对于正常情况,我将完全解码 json 的所有对象)。

我需要这样做没有注释和瞬态,只需添加一个反序列化规则以排除Data 类,以防我想这样做。

如何指定要忽略的类的广告解码时间?

我的模特:

public class Manager{
    String name;
    Data data;
}

public class Data{
    String dummy;
    String dummy2;
}

Json 示例:

{"manager":{"name":"testname","data":{"dummy":"testname", "dummy2":"testname2"}}} 

全部解码的代码示例:

GsonBuilder gsonBuilder = new GsonBuilder();
new GraphAdapterBuilder()
                .addType(Data.class)
                .addType(Manager.class)
                .registerOn(gsonBuilder);
Gson gson = gsonBuilder.create();
Manager manager = gson.fromJson(json, Manager.class);

【问题讨论】:

  • 注册一个类型适配器,它(以某种方式)知道它是否是“特殊情况”,然后不对data字段做任何事情?
  • 您在发布版本中需要这个?
  • 什么是特例?它可以在程序运行期间改变吗?也许stackoverflow.com/questions/23920740/… 会帮助你(从空集合中清除了一个 JSON)。

标签: java android json gson


【解决方案1】:

对你来说幸运的是,我上周猛烈抨击了你想要实现的目标的衍生品。所以正如我在post 中提到的那样,发布版本中有一个小技巧可能适合你想要做什么:

显然需要解析类中的toString()方法 使 Gson 库正常工作。

toString() 方法将类公开给序列化。

话虽如此,如果您使用的是发布版本并且不添加任何proguard规则,您可以使用以下方法排除数据:

@Override
public String toString() {
    return "Manager{" +
            "name='" + name + '\'}';
}

【讨论】:

  • OP 想要排除 Data 类以防万一他想这样做,那么您如何实现呢?
  • 我做了一些测试,这里有完整的解释github.com/Ciardini/error02
  • 基本上,当在 toString() 方法中不包含字段时,它不会被序列化为签名的发布版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2020-11-20
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多