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

时间:2016-02-11 21:16:37

标签: json gson android-json

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

我无法访问网络调用和转换之间的任何代码,所以我试图通过GsonBuilder或Annotations找到一种简洁的方法来修改Object的转换方式。 / p>

// 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" }

感谢您的帮助。 :)

2 个答案:

答案 0 :(得分:5)

更新我查看了GsonBuilder,是的,您可以通过自定义序列化来实现。您需要覆盖serialize

JsonSerializer<type>方法

只需定义一个类,如下所示。这里只添加了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转换目的定义虚拟pojos。在发送使用setter为pojo对象赋值并在pojo上使用gson时,反之亦然或在上面的解决方案中使用自定义序列化和反序列化所需的类。

答案 1 :(得分:1)

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

我确实发现你可以遍历孩子的条目并手动将它们添加到父母。不幸的是,这会产生副作用,通常会添加不需要的值,例如我的常量,或任何值为&#39; 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;
    }
}