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;
}
}
有没有一种简单的方法可以将嵌套对象的转换方式转换为 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;
}
}