Android:尝试序列化…忘记注册types适配器?“

如何使用Gson将HashMap转换为JSON。

class ClassData { public String jsonString; public Class classType; } HashMap map = new HashMap(); void convert(){ new Gson().toJson(map); // throws } 

我正在接受下一个例外

尝试序列化java.lang.Class:java.lang.String。 忘记注册一个types适配器?

您需要为ClassData实现自己的自定义序列化程序,然后将其注册到Gson Builder。

 public class ClassDataSerializerExample { static class ClassData { public String jsonString; public Class classType; public ClassData(String jsonString, Class classType) { this.jsonString = jsonString; this.classType = classType; } } static class ClassDataSerializer implements JsonSerializer { @Override public JsonElement serialize(ClassData src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(src.jsonString); } } public static void main(String[] args) { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(ClassData.class, new ClassDataSerializer()); HashMap map = new HashMap<>(); map.put("key", new ClassData("key", String.class)); Gson gson = gsonBuilder.create(); String json = gson.toJson(map); System.out.println(json); } } 

输出:{“key”:“key”}

阅读更多: https : //sites.google.com/site/gson/gson-user-guide#TOC-Writing-a-Serializer

我的方法适用于带有Java 1.7的Gson 2.3.1,不能保证它适用于Android。

问题在于variablesclassType ,因为Gson不能按原样处理typesClass 。 所以我们必须为Class创建一个TypeAdapter。

 public class ClassTypeAdapter extends TypeAdapter> { @Override public void write(JsonWriter jsonWriter, Class clazz) throws IOException { if(clazz == null){ jsonWriter.nullValue(); return; } jsonWriter.value(clazz.getName()); } @Override public Class read(JsonReader jsonReader) throws IOException { if (jsonReader.peek() == JsonToken.NULL) { jsonReader.nextNull(); return null; } Class clazz = null; try { clazz = Class.forName(jsonReader.nextString()); } catch (ClassNotFoundException exception) { throw new IOException(exception); } return clazz; } } 

为了使它工作,你需要一个TypeAdapterFactory。

 public class ClassTypeAdapterFactory implements TypeAdapterFactory { @Override public  TypeAdapter create(Gson gson, TypeToken typeToken) { if(!Class.class.isAssignableFrom(typeToken.getRawType())) { return null; } return (TypeAdapter) new ClassTypeAdapter(); } } 

并将TypeAdapterFactory注册到您的Gson Builder。

 gsonBuilder.registerTypeAdapterFactory(new ClassTypeAdapterFactory()); 

AFAIK你必须使用TypeAdapterFactory。 直接注册的TypeAdapter

 gsonBuilder.registerTypeAdapter(Class.class, new ClassTypeAdapter()); 

遇到types为Class的对象时,似乎会被忽略。

Gson将HashMap和Java类实例转换为JSON对象。 例:

 { "hash_key_1": { "jsonString": "json_string_instance_1", "classType": "my.class.Name1" }, "hash_key_2": { "jsonString": "json_string_instance_2", "classType": "my.class.Name2" } }