Это потому, что экземпляры, реализующие 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>>
, но в итоге получился пустой набор записей. Обернуть его в другую карту мне помогло. Я обновил строку в ответе.