Как сериализовать / десериализовать вложенную хеш-таблицу в JSON? - PullRequest
0 голосов
/ 20 января 2019

У меня есть приложение для Android. Я использую следующую структуру для хранения некоторых данных в SharedPreferences:

Hashtable<Integer, Hashtable<Size, Time>> 

Я делаю сериализацию следующим образом:

private static String serialize(Hashtable<Integer, Hashtable<Size, Time>> results) {
    Gson gson = new GsonBuilder().create();
    return gson.toJson(results);
}

и десериализация:

private Hashtable<Integer, Hashtable<Size, Time>> deserialize(String resultsJsonStr) {

    if (resultsJsonStr == null)
        return new Hashtable<>();
    else {
        Type typeOfHashMap = new TypeToken<Hashtable<Integer, Hashtable<Size, Time>>>() {}.getType();
        return new Gson().fromJson(resultsJsonStr, typeOfHashMap);
    }
}

Однако, когда я пытаюсь десериализовать, я получаю исключение:

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

Моя сериализованная строка выглядит так: {"3": {"4x4": "01:12:37 AM"}}

1 Ответ

0 голосов
/ 20 января 2019

Проблема в том, что объекты Time не сериализуемы, и вы должны представить механизм сериализации и десериализации для него. Я предположил, что класс Time в вашем коде равен java.sql.Time, который является дочерним классом java.util.Date, поэтому он имеет оба:

public long getTime() { ... }

и

public void setTime(long time) { ... }

Я разработал пример кода для него, вы можете изменить его, как хотите:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.sql.Time;
import java.util.Hashtable;

public class SerializeHelper {

    private static Gson gson;

    static {
        JsonSerializer<Time> serializer = new JsonSerializer<Time>() {
            @Override
            public JsonElement serialize(Time src, Type type, JsonSerializationContext context) {
                return src == null ? null : new JsonPrimitive(src.getTime());
            }
        };

        JsonDeserializer<Time> deserializer = new JsonDeserializer<Time>() {
            @Override
            public Time deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
                return json == null ? null : new Time(json.getAsLong());
            }
        };

        gson = new GsonBuilder()
                .registerTypeAdapter(Time.class, serializer)
                .registerTypeAdapter(Time.class, deserializer).create();
    }

    public static String serialize(Hashtable<Integer, Hashtable<Size, Time>> results) {
        return gson.toJson(results);
    }

    public Hashtable<Integer, Hashtable<Size, Time>> deserialize(String resultsJsonStr) {
        if (resultsJsonStr == null)
            return new Hashtable<>();
        else {
            Type typeOfHashMap = new TypeToken<Hashtable<Integer, Hashtable<Size, Time>>>() {
            }.getType();
            return gson.fromJson(resultsJsonStr, typeOfHashMap);
        }
    }

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