2012-09-12 5 views
4

gson을 사용하여 JSON 표현에서 POJO 객체를 비 직렬화합니다.GSON을 사용하여 JSON이 포함 된 객체의 비 직렬화

내 POJO 중 하나의 필드 중 임의의 JSON 데이터를 포함하고 싶습니다. 예를 들어 :

{ 
    "stringField": "booger", 
    "jsonField" : 
    { 
     "arbitraryField1": "foo" 
    } 
} 

을하고 결과 B.jsonFieldfooarbitraryField으로 된 JSONObject가 포함되어 있습니다

class B { 
    public String stringField; 
    public JsonObject jsonField; 
} 

나는 다음과 같은 JSON에 Gson.fromJson(json, B.class)를 호출 할 수 싶습니다.

그러나이 작업을 시도하면 jsonField은 항상 빈 개체 ({})입니다.

new Gson().fromJson("{ foo: 1 }", JsonObject.class) 

내가 필드를 포함하는 객체가 내가 가지고 어떻게 값 1

foo라는 이름의 반환 위를 기대 : 사실, 더 일반적으로, 다음은 항상 빈 객체를 반환 것으로 보인다 gson은 json을 POJOS에 deserialize 할 때 임의의 json 데이터를 보존합니까?

답변

3

JsonObject가 포함 된 래퍼 개체를 도입 한 다음 원래 json을 반환하는 해당 개체에 대한 사용자 지정 데시리아 화 프로그램을 작성하여이 문제를 해결할 수있었습니다. 그러나 더 나은 방법이 있어야하는 것처럼 보입니다. 후손, 디시리얼라이저와 사소한 래퍼 객체의 경우

는 다음과 같이 :

class MyJsonObjectWrapperDeserializer implements JsonDeserializer<MyJsonObjectWrapper> { 
    @Override 
    public MyJsonObjectWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     return new MyJsonObjectWrapper(json.getAsJsonObject()); 
    } 
} 

class MyJsonObjectWrapper { 
    public JsonObject json; 

    public MyJsonObjectWrapper(JsonObject json) { 
     this.json = json; 
    } 
} 
1

the doc의 내 해석이 디시리얼라이저를 고려하십시오.

import com.google.gson.*; 
import java.lang.reflect.Type; 

class B { 
    public String stringField; 
    public JsonObject jsonField; 
} 

class BDeserializer implements JsonDeserializer<B> { 
    public B deserialize(JsonElement json, Type typeOfT, 
         JsonDeserializationContext context) 
       throws JsonParseException { 
     JsonObject jsonObject = json.getAsJsonObject(); 

     B b = new B(); 
     b.stringField = jsonObject.get("stringField").getAsString(); 
     b.jsonField = jsonObject.getAsJsonObject("jsonField"); 

     return b; 
    } 
} 

public class Test { 
    static public void main(String[] args) { 
     GsonBuilder gson = new GsonBuilder(); 
     gson.registerTypeAdapter(B.class, new BDeserializer()); 

     String json = " { \"stringField\" : \"booger\", \"jsonField\" : { \"arbitraryField1\" : \"foo\" } } "; 

     B b = gson.create().fromJson(json, B.class); 
     System.out.println(b.stringField); 
     System.out.println(b.jsonField.toString()); 
    } 
} 
+0

물론, 사용자 정의 디시리얼라이저를 작성할 수 있습니다. 내가 제안한 대안에서 본질적으로 무엇을했는지. 하지만 해킹처럼 보입니다. 사용자 지정 디시리얼라이저가 포함되지 않은 방법이 있다면 더 좋을 것입니다. – emmby

+0

게시 할 때 질문을 조사하고 답을 찾지 못했습니다. 원래의 질문은 사용자 지정 디시리얼라이저에 대해 알고 있고 뭔가 더 우아한 것을 찾고 있다는 표시가 없습니다. 의사가 표준 방법 인 것처럼 보입니다. –

2

당신은 JsonParser를 사용할 수 있습니다

JsonParser parser = new JsonParser(); 
JsonObject o = parser.parse("{ \"foo\": \"1\" }").getAsJsonObject(); 
관련 문제