2014-06-09 2 views
1

json 문자열에서 개체의 인스턴스를 만들려고합니다. 이 내 객체입니다구조가 다를 때 JSON 문자열을 JAVA 개체로 변환하는 방법

public class Person { 
    String name; 
    String address; 
} 

이 내 변환기입니다 :

Gson gson = new Gson(); 
Person p = gson.fromJson(str, Person.class); 

문제는 내 입력 문자열의 형식은 예를 들어, 내 Person 객체보다 더 복잡 할 수 있다는 것입니다 :

{ 
    "name":"itay", 
    "address":{ 
     "street":"my street", 
     "number":"10" 
    } 
} 

또는 address의 값은 간단한 문자열 일 수 있습니다 (이 경우에는 문제가 없습니다). p.address에 json 객체를 문자열로 포함하고 싶습니다. 이것은 단지 내 문제의 예일뿐입니다. 실제로 "주소"는 훨씬 더 복잡하고 구조는 알 수 없습니다.

public class BetterPerson { 
    String name; 
    Object address; 
} 

지금, address 개체 내가 값을 얻을 수 .toString()를 사용할 수 있습니다

내 솔루션에 Person 클래스를 변화하고 있습니다.

더 좋은 방법이 있나요?

답변

0

JsonDeserializer으로 시도하면 런타임시 결정되는 JSON 구조에 따라 비 직렬화가 가능합니다. 이 구조는 또한 알 수없는 있다면

class Person { 
    private String name; 
    private Object address; 
    // getter & setter 
} 

class Address { 
    private String street; 
    private String number; 
    // getter & setter 
} 

... 

class PersonDeserializer implements JsonDeserializer<Person> { 

    @Override 
    public Person deserialize(final JsonElement json, final Type typeOfT, 
      final JsonDeserializationContext context) throws JsonParseException { 

     JsonObject jsonObject = json.getAsJsonObject(); 

     Person person = new Person(); 
     person.setName(jsonObject.get("name").getAsString()); 

     JsonElement jsonElement = jsonObject.get("address"); 
     if (!jsonElement.isJsonObject()) { 
      String address = jsonElement.getAsString(); 
      person.setAddress(address); 
     } else { 
      JsonObject addressJsonObject = (JsonObject) jsonElement; 

      Address address = new Address(); 
      address.setNumber(addressJsonObject.get("number").getAsString()); 
      address.setStreet(addressJsonObject.get("street").getAsString()); 
      person.setAddress(address); 
     } 

     return person; 
    } 
} 

Person data = new GsonBuilder() 
     .registerTypeAdapter(Person.class, new PersonDeserializer()).create() 
     .fromJson(jsonString, Person.class); 

if (data.getAddress() instanceof Address) { 
    Address address = (Address) data.getAddress(); 
} else { 
    String address = (String) data.getAddress(); 
} 

당신은뿐만 아니라 추가 Address POJO 클래스를 사용하지 않고 HashMap<String,String> address을 시도 할 수 있습니다 : 추가 정보를 위해

GSON Deserialiser Example

샘플 코드를 살펴 있습니다.

는 주소 인 경우 문자열 다음 주소 객체를 생성하고 거리 변수의 주소 문자열을 설정할 경우 아래 그림과 같이 여러분이이 방법으로 할 수

: 내가 말했듯이

class Person { 
    private String name; 
    private Address address; 
    // getter & setter 
} 


... 
JsonElement jsonElement = jsonObject.get("address"); 
if (!jsonElement.isJsonObject()) { 
    String address = jsonElement.getAsString(); 
    Address obj = new Address(); 
    obj.setStreet(address); 
    person.setAddress(obj); 
}else{...} 
+0

- "주소"구조를 알 수 (런타임에만 결정됨) –

+0

내 게시물을 업데이트 중입니다. 잠시만 기다려주십시오 – Braj

+0

이제 내 게시물을보십시오. – Braj

관련 문제