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;
    }
}