Gson - 将嵌套对象序列化为属性

Gson - Serialize Nested Object as Attributes

有没有一种简单的方法可以将嵌套对象的转换方式转换为 JSON?我试图只创建一个 JSON 对象来匹配后端。我正在为我的网络使用 Retrofit,它使用 Gson 将对象转换为 JSON。

我无权访问网络调用和转换之间的任何代码,因此我试图找到一种干净的方法来修改对象的转换方式,通过 GsonBuilder 或注释。

// Automatically converted to JSON with passed in Gson.
Call<myObject> search( @Body foo myFoo ); 

public class foo {
    String text = "boo";
    bar b = new bar();
}

public class bar {
    String other = "moo";
}

结果:

{ "text": "boo", "b" { "other": "moo" } }

期望的结果:

{ "text": "boo", "other": "moo" }

感谢您的帮助。 :)

更新 我查看了 GsonBuilder,是的,您可以使用自定义序列化来完成。您需要覆盖 JsonSerializer<type>

serialize 方法

定义一个class如下。这里只添加了 2 个属性。

public class FooSerialize implements JsonSerializer<foo> {

@Override
    public JsonElement serialize(foo obj, Type foo, JsonSerializationContext context) {

         JsonObject object = new JsonObject();
         String otherValue = obj.b.other;
         object.addProperty("other", otherValue );
         object.addProperty("text", obj.text);
         return object;
    }
  }

创建 gson 对象如下。

Gson gson = new GsonBuilder().registerTypeAdapter(foo.class, new FooSerialize()).setPrettyPrinting().create();

只需转换为Json

 gson.toJson(fooObject);

瞧! lmk 如果它适合你。我在我的系统上测试它工作。忘记字符串覆盖它会被调用以进行 Json 到 Obj 的转换。这只是序列化,您还需要处理反序列化到对象。寻找在线资源以了解类似的想法。

替代解决方案是仅为 JSON 转换目的定义虚拟 pojo。在发送时使用 setter 将值分配给 pojo 对象并在 pojo 上使用 gson 反之亦然或以上解决方案为您需要的 class 进行自定义序列化和反序列化。

为了向我试图完成的事情添加更多细节,让我展示一下我写的内容,因为它可能会帮助其他正在尝试做同样事情的人。虽然我的父对象 ( foo ) 只有几个变量,但我的子对象 ( bar ) 有一长串可能的变量。

我确实发现您可以遍历子项的条目并将它们手动添加到父项。不幸的是,这会产生经常添加不需要的值的副作用,例如我的常量或任何值为“0”的整数。

希望这对某人有所帮助。

public class FooSerializer implements JsonSerializer<Foo> {
     @Override
     public JsonElement serialize(Foo src, Type typeOfSrc, JsonSerializationContext context) {
         JsonObject object = new JsonObject();

         object.addProperty("text", src.text);

         bar myBar = src.getBar();

         // Using the context to create a JsonElement from the child Object.
         JsonElement serialize = context.serialize(myBar, bar.class);
         JsonObject asJsonObject = serialize.getAsJsonObject();

         // Getting a Set of all it's entries.
         Set<Map.Entry<String, JsonElement>> entries = asJsonObject.entrySet();

         // Adding all the entries to the parent Object.
         for (Map.Entry<String, JsonElement> entry : entries) {
             object.addProperty(entry.getKey(), entry.getValue().toString());
         }     

         return object;
    }
}