GSON

2017-12-25 6 views
0

내가 클래스 A, B, C의 그룹이 있다고 가정하자 알 수없는 클래스를 직렬화 :GSON

공용 클래스 A : INT 번호;

공용 클래스 B : int number; 문자열 주소.

공용 클래스 C : int orderNumber;

어떻게 이러한 클래스 만 포함되어 있지만 알 수없는 순서로 Java에서 Gson을 사용하여 Json 문자열을 역 직렬화 할 수 있습니까? 예 :

{//A 
"number" : 3 
} 
//C 
{ 
"orderNumber": 10 
} 
//B 
{ 
"number" : 5 
"address" : "New York" 
} 
//C 
{ 
"orderNumber": 1 
} 

대단히 감사합니다.

+0

내가 먼저 (잭슨 JsonNode 같은) 일반적인 구조로 JSON 페이로드를 변환 한 다음에 캐스팅 할 클래스를 결정한다고 생각합니다. –

+0

json을 해시 맵으로 비 직렬화 할 수 있습니다. – user1516873

답변

0

필드가 더 복잡한 클래스가있는 경우 일반적으로이 방법을 사용하는 것이 일반적이지 않습니다.

그러나

당신이 직렬화하는 클래스는 예를 들어 다음 모든 필드

@Getter 
public class Z { 
    private Integer orderNumber; 
    private Integer number; 
    private String address; 
} 

당신은 Z의 목록을 얻을 것이다 갖는 따라 클래스를 만들 때 사용자가 제공하는 것처럼 간단한 경우의 어떤에 필드가 null이거나 null이 필요합니다. 나중에 A, B 또는 CZ에서 생성 할 수 있습니다.

deserialize 할 클래스가 더 복잡한 경우 어쨌든 구문 분석하고 반환 할 클래스를 결정하는 메커니즘을 만들어야합니다. AB 또는 C - - 항목을 구축 할 것 user1516873 당신이 어떤 클래스에 그 맵에 존재하는 어떤 필드로 결정해야 할 각 항목에 대해

Collection<Map<String,String>> 

그래서 주석의 제안처럼은 될 수있다.

0

답 : pirho 님이 제공 한 것처럼 수업이 간단하면 깨끗하고 쉽습니다. 그러나 그렇지 않은 경우에는 자체 디시리얼라이저를 작성할 수 있습니다.

public class PayloadJsonDeserializer implements JsonDeserializer { 
    @Override 
    public Object deserialize(JsonElement elm, Type type, JsonDeserializationContext context) throws JsonParseException { 
     // create java objects based on the properties in the json object 
     JsonPrimitive orderNumber = elm.getAsJsonObject().getAsJsonPrimitive("orderNumber"); 
     if(!orderNumber.isJsonNull()) { 
      return new C(orderNumber.getAsInt()); 
     } 

     return null; 
    } 
} 

사용자 정의 디시리얼라이저를 Gson으로 등록하십시오.

GsonBuilder gsonBuilder = new GsonBuilder() 
        .registerTypeAdapter(PayloadJson.class, new PayloadJsonDeserializer()); 
Gson gson = gsonBuilder.create(); 

json을 비 직렬화하는 데 사용하십시오.

gson.fromJson(jsonString, PayloadJson[].class);