2011-11-14 80 views
4

我使用GSON和我有一個對象,它的領域之一是類GSON不解析類變量

class A { 
… 
private Class aClass; 
… } 

當我使用默認GSON對象ACLASS自帶空解析實例JSON。

任何想法,爲什麼?

+1

你有公共的getter/setter for aClass嗎? – PeterMmm

+0

您是否將Json解析爲對象(JSON-> Object)或將對象轉換爲Json字符串(Object-> JSON)?如果你解析Json,你的'aClass'字段是什麼樣的? – Thomas

+0

GSON不使用獲取者/設置者。它只使用類中的字段。 – Zemzela

回答

5

您需要自定義類型的適配器。下面是例子:

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 
+0

您可以拋出JsonParseException而不是RuntimeException。 – msteiger

3

當我分析的情況下使用默認GSON對象的Json ACLASS來到空。

任何想法,爲什麼?

a comment in issue 340,一個GSON項目經理解釋說:

序列化類型實際上是有些安全問題的,所以我們不希望默認支持。惡意的.json文件可能會導致您的應用程序加載它不會以其他方式運行的類;取決於你的類路徑加載某些類可能會阻止你的應用程序。

但是,在您自己的應用程序中編寫類型適配器以支持此操作非常簡單。

當然,由於序列化與反序列化不同,我不明白這是如何解釋禁用序列化,除非未提到的概念是從某種意義上來說「平衡」序列化的默認行爲與反序列化。