я не могу найти никакой документации по этому вопросу, но, кажется, Gson сериализует поля подкласса перед теми из супер-класса:Сериализовать подкласс после суперкласса?
class G9 {
static class B { String s1 = "1"; String s2 = "2"; }
static class C extends B { String s3 = "3"; }
public static void main(String args[]) {
System.out.println(new Gson().toJson(new C()));
}
}
Эта программа производит следующий вывод:
/cygdrive/c/Java/jdk1.8.0/bin/javac -classpath gson-2.1.jar -g G9.java && /cygdrive/c/Java/jdk1.8.0/bin/java -classpath ".;gson-2.1.jar" G9
{"s3":"3","s1":"1","s2":"2"}
I хотелось бы, чтобы это было следующее:
{"s1":"1","s2":"2","s3":"3"}
Я понимаю, что я могу сделать это с TypeAdapter
но по существу составляет
- реализации сериализации
- выяснить, как делегировать десериализации в
Gson
ИЛИ реализации, что хорошо.
Есть ли более простой способ достичь этого? Я думаю, я ищу new FieldOrderingTypeAdapter<C>(C.class, "s1", "s2", "s3")
или GsonBuilder.setFieldOrder("s1", "s2", "s3")
или что-то в этом роде.
Я использую Gson 2.1
.
Дело в том, что даже если вы каким-то образом определяете порядок, который должен использоваться для генерации полей, вывод JSON может не отражать этот порядок. Порядок элементов в объекте JSON не может быть указан или контролироваться. –
@HotLicks, я думаю, что ключевая фраза здесь «может не отразиться». Я признаюсь, что не тестировал с помощью «TypeAdapter», а предположил, что произведенная строка json будет соответствовать порядку вызовов JsonWriter.write, вероятно, исходя из опыта использования другой сериализации. Вы знаете, что это ложь? –
Это может соответствовать сегодняшнему, а не завтра. Зависеть от этого было бы глупостью (если только инструмент не описывает это поведение). –