сериализовать объект json, который расширяет карту - PullRequest
2 голосов
/ 08 июня 2011

Почему это не работает?

public static class MyBean extends HashMap<String, String> {
    public String city;
}

/**
 * @param args
 */
public static void main(String[] args) {
    MyBean bean = new MyBean(); 
    bean.city = "some city";

    Gson gson = new Gson();

    String json = gson.toJson(bean);
    System.out.println(json);
    }

Почему я не вижу значения города в json?

1 Ответ

4 голосов
/ 08 июня 2011

Это потому, что экземпляры, реализующие Map, имеют особую обработку от Gson. По умолчанию только его набор записей будет сериализован. Вам необходимо создать настраиваемый сериализатор, который сериализует как входной набор, так и свойства бина, представляющие интерес отдельно.

Е.Г.

public class MyBeanSerializer implements JsonSerializer<MyBean> {

    @Override
    public JsonElement serialize(MyBean myBean, Type type, JsonSerializationContext context) {
        JsonObject object = new JsonObject();
        object.add("map", context.serialize(new HashMap<String, String>(myBean)));
        object.add("city", context.serialize(myBean.city));
        return object;
    }

}

Что можно использовать следующим образом:

Gson gson = new GsonBuilder().registerTypeAdapter(MyBean.class, new MyBeanSerializer()).create();
String json = gson.toJson(bean);
System.out.println(json);

Обновление : хм, согласно комментарию к вопросу (на самом деле вы должны были опубликовать его в ответе, чтобы меня немедленно уведомили), context.serialize(myBean.entrySet()), похоже, не сработало , И вы правы, я только что провела локальное тестирование и получила то же исключение. Я попытался добавить TypeToken на Set<Entry<String, String>>, но в итоге получился пустой набор записей. Обернуть его в другую карту мне помогло. Я обновил строку в ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...