代码之家  ›  专栏  ›  技术社区  ›  PsCraft

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

  •  1
  • PsCraft  · 技术社区  · 6 年前

    我有一个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_对象,但在第1行第8列路径处为字符串$

    我的串行字符串看起来像: “3”:“4x4”:“01:12:37 AM”

    1 回复  |  直到 6 年前
        1
  •  0
  •   aminography    6 年前

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