【问题标题】:Gson remove unnecessary nested object fieldsGson 删除不必要的嵌套对象字段
【发布时间】:2016-09-29 11:46:45
【问题描述】:

我正在尝试序列化一个对象。我有以下结构:

Class A{
String aField1;
String aField2;
B bObj;
}
Class B{
String bField1;
String bField2;
String bField3;    
}

我正在尝试序列化 A 类和 B 类对象以将它们发送到服务器。 当我序列化 Class A 对象时,它给了我

{
 aField1: "abc",
 aField2: "def",
 B: {
    bField1: "mnp",
    bField2: "qrt",
    bField3: "xyz",
    }
}

并序列化Class B obj:

{
 bField1: "mnp",
 bField2: "qrt",
 bField3: "xyz",
}

但我想要这样的 Class A 对象:

{
 aField1: "abc",
 aField2: "def",
 B: {
    bField1: "mnp"
    }
}

我目前正在使用 GSON 库来完成此操作。 我想在与服务器交互时删除额外的键值对。 我该怎么做?

【问题讨论】:

标签: android serialization gson deserialization


【解决方案1】:

像这样更改您的 Serialize 类。

public class A implements Serializable{
    String aField1;
    String aField2;
    B bObj;

    class B{
        String bField1;
        String bField2;
        String bField3;
    }
}

只需删除多余的字段。它不会有任何问题。

【讨论】:

  • 我需要这些字段。
  • 我想为 A 类和 B 类制作 json 对象。在为 B 类制作 json 对象时,我需要所有字段,但是在为 A 类制作 json 时,我需要包含 B 类的一些特定字段。
【解决方案2】:

您可以将bField2bField3 标记为transient 或使用注解@Expose(serialize = false)

或者您可以自定义您的序列化排除策略。
示例代码:

GsonBuilder builder = new GsonBuilder();
Type type = new TypeToken <A>(){}.getType();
builder.addSerializationExclusionStrategy(
        new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes fieldAttributes) {
                return fieldAttributes.getName().equals("bField2") ||
                            fieldAttributes.getName().equals("bField3");
            }
            @Override
            public boolean shouldSkipClass(Class<?> aClass) {
                return false;
            }
        }
);

【讨论】:

  • Type type = new TypeToken &lt;A&gt;(){}.getType(); 不是必需的,这:equals("bField3") --> )
  • 没问题:),那第二行Type呢,有什么理由保留吗?
  • @emecas,其实builder.create().fromJson(reader, type)会返回反序列化的对象
猜你喜欢
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多