2017-10-05 6 views
1

json 문자열을 Java 개체로 변환하는 데 gson을 사용하고 있습니다. 내 응용 프로그램에서는 자식 클래스가있는 하나의 추상 클래스를 만듭니다. 이것이 내 수업 구조입니다. enter image description hereGson : gson을 사용하여 json 개체를 자식 클래스 개체로 변환하는 방법

이 경우 gson을 사용하여 특정 개체를 만들고 싶습니다. 특정 자바 개체를 만들려면 다음 코드를 사용하고 있습니다.

public class InterfaceAdapter<T> implements JsonSerializer<T>, JsonDeserializer<T> 
{ 

    @Override 
    public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { 
     JsonObject jsonObject = new JsonObject(); 
     jsonObject.addProperty("type", src.getClass().getName()); 
     jsonObject.add("data", context.serialize(src)); 
     return jsonObject; 
    } 

    @Override 
    public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException 
    { 
     JsonObject jsonObject = (JsonObject) json; 
     JsonElement jsonTypeElement = get(jsonObject, "type"); 
     JsonElement dataElement = get(jsonObject, "data"); 
     final Type actualType = typeForName(jsonTypeElement); 

     return context.deserialize(dataElement, actualType); 
    } 

    private Type typeForName(final JsonElement typeElem) 
    { 
     try 
     { 
      return Class.forName(typeElem.getAsString()); 
     } 
     catch (ClassNotFoundException e) 
     { 
      throw new JsonParseException(e); 
     } 
    } 


    private JsonElement get(final JsonObject wrapper, final String memberName) 
    { 
     final JsonElement elem = wrapper.get(memberName); 

     if (elem == null) 
     { 
      throw new JsonParseException(
        "no '" + memberName + "' member found in json file."); 
     } 
     return elem; 
    } 
} 

이 프로그램의 실행 후 난 단지 BaseClass로 객체를 가지고 :

GsonBuilder gsonBuilder = new GsonBuilder(); 
       gsonBuilder.registerTypeAdapter(BaseClass.class, new InterfaceAdapter<BaseClass>()); 
       gsonBuilder.setPrettyPrinting(); 
       Gson gson = gsonBuilder.create(); 
    BaseClass baseClass = gson.fromJson(jsonObject.toString(),BaseClass.class); 
// Instead of this I used following function to create particular class object. 

//Optional function 
Class<BaseClass> clazz = (Class<BaseClass>) Class.forName("com.example." + "A"); 
BaseClass baseClass = gson.fromJson(jsonObject.toString(), clazz.getClass()); // This is not working for me 

여기 내 InterfaceAdapter 코드입니다. 나는 A, B 또는 C 객체와 같은 특정 자바 객체를 만들고 싶다. 그것은 내가 원하는 특정 Java 객체를 제공받지 못한다. 나도 알아, 나는 뭔가를 그리워. 그럼 실수를 어디서해야합니까?

+0

fromJson() 메서드에서 BaseClass.class 대신 A.class 또는 B.class 또는 C.class를 사용하십시오. – chandil03

답변

-1

Gson이 seralize 사용할 수 있습니다/객체 클래스를 직렬화하는 GSON를 사용

역 직렬화 :

public String serializeToJson(MyClass myClass) { 
    Gson gson = new Gson(); 
    String j = gson.toJson(myClass); 
    return j; 
} 

을 객체로 역 직렬화하는 GSON 사용.

// Deserialize to single object. 
public MyClass deserializeFromJson(String jsonString) { 
    Gson gson = new Gson(); 
    MyClass myClass = gson.fromJson(jsonString, MyClass.class); 
    return myClass; 
}