如何将嵌套的哈希表序列化/反序列化为JSON?

时间:2019-01-20 10:29:27

标签: android json hashtable

我有一个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,但位于第1行第8列的路径$

我的序列化字符串如下所示: {“ 3”:{“ 4x4”:“ 01:12:37 AM”}}

1 个答案:

答案 0 :(得分:0)

问题是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);
        }
    }

}