2013-07-28 5 views
6

나는이 같은 JSON이 있습니다잭슨 구문 분석 JSON은

{ 

    "users":{ 
      "1234":{ 
       "firstname":"Joe", 
       "lastname":"Smith" 
      }, 
      "9876":{ 
       "firstname":"Bob", 
       "lastname":"Anderson" 
      } 
    }, 
    "jobs":[ 
      { 
       "id":"abc", 
       "location":"store" 
      }, 
      { 
       "id":"def", 
       "location":"factory" 
      } 
    ] 
} 

I이 사용 잭슨을 분석하고있어 내가 사용하여 응답을 구문 분석되었습니다 readvalue를 (

public class MyCustomClass{ 
     @JsonProperty("jobs") 
     ArrayList<Job> jobs; 

     @JsonProperty("users") 
     ArrayList<UserMap> usersMap; 
} 

지금 작업이 작업 객체로 완벽하게 분석하지만 나는 그들이 동적 키를 갖고 있기 때문에 사용자가 구문 분석 얻을 수없는 것처럼 MyCustomClass 보이는 JSON, MyCustomClass.class)

. 나는 JsonAnyGetter/세터에 대해 읽고 문자열을 매핑 UserMap 객체지도 제작 시도 -> 이용자 :

public class UserMap { 

private HashMap<String,User> usersMap; 


@JsonAnySetter 
public void add(String key, User user){ 
    usersMap.put(key, user); 
} 

@JsonAnyGetter 
public Map<String, User> getUsersMap(){ 
    return usersMap; 
} 


} 

을하지만 작동하지 않습니다. TypeReference 래퍼를 사용하여이 작업을 수행 할 수 있다고 생각하지만, 그지도 만 돌아 오는 유일한 유형인 경우에만 수행 할 수있는 방법을 생각할 수 있습니다. 나는 다른 유형을 다시 얻고 있기 때문에 (사용자와 작업)이 작업을 수행 할 수 있습니까?

+0

귀하의 JSON이 유효하지 않습니다. 당신은 예를 들어 "앤더슨"이후에 –

+0

나를 미안하다가 미안해합니다. 유효한 json이어야합니다. – pat

답변

9

솔루션 :

public class MyCustomClass { 
    @JsonProperty("users") 
    public LinkedHashMap<String, User> users; 

    @JsonProperty("jobs") 
    public ArrayList<Job> jobs; 
}  
0

사용자 지정 디시리얼라이저를 작성하고 사용중인 개체 매퍼에 등록하여이 문제를 해결할 수 있습니다. 이것은 각 객체가 User 객체로 직렬화 해제되는 방식을 완벽하게 제어 할 수 있기 때문에 효과적입니다.

자신의 비 직렬 변환기를 롤하는 방법은 this jackson documentation을 참조하십시오.

json 구조에 대한 제어 권한이 있다면 - 실제로 json 객체의 일부가 될 것으로 예상되는 키 값 (사용자 ID라고 추측합니다)을 변경합니다. 열쇠. 이렇게하면 문제를 모두 피할 수 있습니다. 예를 들어

:

"users":{ 
     { 
      "id":"1234", 
      "firstname":"Joe", 
      "lastname":"Smith" 
     }, 
     { 
      "id":"9876", 
      "firstname":"Bob", 
      "lastname":"Anderson" 
     }