Почему Gson парсит объекты не по порядку?

153
30 октября 2019, 15:20

Есть два класса:

public class RegisteredUser {
@Expose
@SerializedName("phoneNumber")
private String phoneNumber;
@Expose
@SerializedName("firebase")
private Firebase firebase;
public RegisteredUser(String phoneNumber, Firebase firebase) {
    this.phoneNumber = phoneNumber;
    this.firebase = firebase;
}
public String getPhoneNumber() {
    return phoneNumber;
}
public Firebase getFirebase() {
    return firebase;
}
public static class Firebase {
    @Expose
    @SerializedName("uid")
    private String uid;
    @Expose
    @SerializedName("provoiderId")
    private String providerId;
    public Firebase(String uid, String providerId) {
        this.uid = uid;
        this.providerId = providerId;
    }
    public String getUid() {
        return uid;
    }
    public String getProviderId() {
        return providerId;
    }
}

И код, который парсит все это в json

        Gson gson = new Gson();
        gson.toJson(mRegisteredUser);

По идеи код должен выводить результат:

{
  "phoneNumber": "+380000000000",
  "firebase": {
    "provoiderId": "000",
    "uid": "00000"
  }
}

Но выводит:

{
  "firebase": {
    "provoiderId": "000",
    "uid": "00000"
  },
  "phoneNumber": "+380000000000"
}

Почему не парсит в том порядке, который я задаю в классе? И как исправить?

Answer 1

Для JSON формата порядок не важен, поэтому GSON не гарантирует что порядок объектов в строке JSON будет таким же, как порядок полей в Java классе.
Если Вам, все же необходимо, записывать в определенном порядке, то вы можете написать свой адаптер - https://github.com/google/gson/blob/master/UserGuide.md#TOC-Custom-Serialization-and-Deserialization

Answer 2

GSon не поддерживает порядок парсинга/следования полей (а иногда правда хочется).

Уже давно висит issue, но разработчики прохладно игнорят его отсылая к кастомному адаптеру:

Custom type adapters exist to handle this

В то же время Jackson - поддерживает через аннотацию @JsonPropertyOrder можно явно задавать порядок полей

READ ALSO
cannot be applied to given types

cannot be applied to given types

Не знаю в чём ошибка сижу 2ой час

224
Как продолжить цикл из другого метода

Как продолжить цикл из другого метода

Хочу чтобы из места обозначенного комментарием //это место "перекинуло" в цикл обозначенного //этот цикл, при том, что они находятся в разных...

127
Почему не пропускает hql-запрос?

Почему не пропускает hql-запрос?

Проект с поддержкой springMVCВ запросе подчеркивает FROM('FROM' unexpected)

125
Регулярные выражения Java + JSON

Регулярные выражения Java + JSON

Всем приветВозникла необходимость изменить часть Json'а

136