我使用GSON和我有一個對象,它的領域之一是類GSON不解析類變量
class A {
…
private Class aClass;
… }
當我使用默認GSON對象ACLASS自帶空解析實例JSON。
任何想法,爲什麼?
我使用GSON和我有一個對象,它的領域之一是類GSON不解析類變量
class A {
…
private Class aClass;
… }
當我使用默認GSON對象ACLASS自帶空解析實例JSON。
任何想法,爲什麼?
您需要自定義類型的適配器。下面是例子:
package com.sopovs.moradanen;
import java.lang.reflect.Type;
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;
public class GsonClassTest {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Class.class, new ClassTypeAdapter())
.setPrettyPrinting()
.create();
String json = gson.toJson(new Foo());
System.out.println(json);
Foo fromJson = gson.fromJson(json, Foo.class);
System.out.println(fromJson.boo.getName());
}
public static class ClassTypeAdapter implements JsonSerializer<Class<?>>, JsonDeserializer<Class<?>> {
@Override
public JsonElement serialize(Class<?> src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.getName());
}
@Override
public Class<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
try {
return Class.forName(json.getAsString());
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}
public static class Foo {
Class<?> boo = String.class;
}
}
這段代碼的輸出是:
{
"boo": "java.lang.String"
}
java.lang.String
您可以拋出JsonParseException而不是RuntimeException。 – msteiger
當我分析的情況下使用默認GSON對象的Json ACLASS來到空。
任何想法,爲什麼?
在a comment in issue 340,一個GSON項目經理解釋說:
序列化類型實際上是有些安全問題的,所以我們不希望默認支持。惡意的.json文件可能會導致您的應用程序加載它不會以其他方式運行的類;取決於你的類路徑加載某些類可能會阻止你的應用程序。
但是,在您自己的應用程序中編寫類型適配器以支持此操作非常簡單。
當然,由於序列化與反序列化不同,我不明白這是如何解釋禁用序列化,除非未提到的概念是從某種意義上來說「平衡」序列化的默認行爲與反序列化。
你有公共的getter/setter for aClass嗎? – PeterMmm
您是否將Json解析爲對象(JSON-> Object)或將對象轉換爲Json字符串(Object-> JSON)?如果你解析Json,你的'aClass'字段是什麼樣的? – Thomas
GSON不使用獲取者/設置者。它只使用類中的字段。 – Zemzela