Gson-сериализация вложенного объекта как атрибутов
есть ли простой способ преобразовать, как вложенный объект преобразуется в JSON? Я пытаюсь просто создать один объект JSON, чтобы соответствовать back-end. Я использую Retrofit для своей сети, которая преобразует объект в JSON с помощью Gson.
у меня нет доступа к любому коду между сетевым вызовом и преобразованием, поэтому я пытаюсь найти чистый способ изменить, как объект преобразуется, либо через 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" }
Спасибо за вашу помощь. :)
2 ответов
обновление Я заглянул в 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, если это работает для вас. Я тестировал свою систему, она работала. Забудьте о string override, он вызывается для Json Параметр obj преобразования. Это только сериализация, которую вам нужно обработать для десериализации объекта. Ищите онлайн-ресурсы, чтобы получить представление о подобной линии.
альтернативным решением будет определение фиктивных pojos только для целей преобразования JSON. При отправке используйте сеттеры для присвоения значений объекту pojo и используйте gson на pojo наоборот или выше решения для пользовательской сериализации и десериализации для нужного класса.
я узнал, что вы можете перебирать записи ребенка и вручную добавлять их к родителю. К сожалению, это имеет побочный эффект частого добавления нежелательных значений, таких как мои константы или любое целое число со значением '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;
}
}