объект gson до json и вызывает исключение - PullRequest
0 голосов
/ 19 марта 2020
Gson gson = new Gson();

Type type = new TypeToken<HashMap<Rule, HashSet<Data>>>() {
        }.getType();

String json = gson.toJson(dailyListSave, type);

HashMap<Rule, HashSet<Data>> list = gson.fromJson(json, type);

Последняя строка приведенного выше кода вызывает исключение

com.google.gson.JsonSyntaxException: java .lang.IllegalStateException: ожидается BEGIN_OBJECT, но в строке 1 пути 3 столбца 3 указана строка STRING. $.

Не знаете почему? Очень ценю вашу помощь.

1 Ответ

0 голосов
/ 20 марта 2020

Я понял, что не так.

  1. При использовании HashMap со сложным классом Key, как в приведенном выше классе Rule. вам нужно включить enableComplexMapKeySerialization () для объекта gson.
  2. Элемент списка Класс данных является абстрактным классом. При использовании абстрактного класса для сериализации / десериализации вам необходимо зарегистрировать свой пользовательский адаптер типа.

Здесь фрагмент кода

        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.registerTypeAdapter(Data.class, new DataJsonAdapter());
        gsonBuilder.enableComplexMapKeySerialization();
        gson mGson = gsonBuilder.create();

Вот реализация класса DataJsonAdaptor

Важно установить конкретное имя класса во время сериализации и использовать его во время десериализации. Имя класса хранится в «типе»

public class DataJsonAdapter implements JsonSerializer<Data>, JsonDeserializer<Data> {
    @Override
    public JsonElement serialize(Data src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject result = new JsonObject();
        result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));
        result.add("properties", context.serialize(src, src.getClass()));
        return result;
    }

    @Override
    public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        String type = jsonObject.get("type").getAsString();
        JsonElement element = jsonObject.get("properties");
        try {
                return context.deserialize(element,
                        Class.forName("com.package.name"  + type));
        } catch (ClassNotFoundException cnfe) {
            throw new JsonParseException("Unknown element type: " + type, cnfe);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...