Поле участника игнорируется при разборе с использованием gson

Я анализирую POJO в json, используя библиотеку Google gson. Это задействованные объекты:

// Order.java
public class Order {
    // ...
    private int id;
    private String name;
    private Location location;
    // ...
}
// Location.java
public class Location {
    // ...
    private String address;
    private float latitude;
    private float longitude;
    private String postcode
    // ...
}

Когда я запускаю его через gson (убедившись, что переменная-член Location не равна нулю), используя new Gson().toJson(order), я получаю следующие результаты:

{
    "id" : 1,
    "name" : "nameValue"
}

но я ожидал получить что-то вроде этого:

{
    "id" : 1,
    "name" : "nameValue",
    "location" : {
            "address" : "some address",
            "latitude" : 53.346346,
            "longitude" : -3.346363,
            "postcode" : "23563"
        }
}

Не могу понять, почему это происходит. Кто-нибудь сталкивался с этим? Что может быть такого, что я делаю неправильно?

Я попытался установить пользовательский адаптер типа без везения.

Спасибо за вашу помощь.


person pablisco    schedule 27.04.2012    source источник
comment
Вы пытались отключить опцию игнорировать нулевое значение в gson? попробуйте создать свой экземпляр gson с помощью Gson gson = new GsonBuilder().serializeNulls().create(); и посмотрите, получите ли вы location: null?   -  person Yenchi    schedule 27.04.2012


Ответы (1)


Хорошо, я понял, в чем дело. У меня была фабрика фиктивных объектов, которая создавала фиктивные объекты с помощью анонимного конструктора в типе Location, например:

Location location = new Location() {
    {
         setAddress("some address");
         setLatitude(53.346346);
         setLongitude(-3.356363);
         setPostCode("23563");
    }
};

Итак, Гсон интерпретировал его как анонимный класс и, как сказано в документации:

Поля, соответствующие внешним классам во внутренних классах, анонимных классах и локальных классах, игнорируются и не включаются в сериализацию или десериализацию.

Я изменил его на обычный способ настройки GsonBuilder, и все работает, как и ожидалось. Однако мне интересно, можно ли использовать этот тип инициации, поскольку он работает для коллекций (ArrayList). Это облегчает чтение моих макетов фабрик. :)

person pablisco    schedule 27.04.2012