2011-12-06 2 views
5

객체 클래스를 매핑 :잭슨 : 객체 클래스를 포함 JSON 변환하는

class User{ 
    public String name; 
    public String password; 
} 

JSON :

{ sc:"200", msg:"something", userInfo:{name:"n", password:"p"} } 

는이 같은 결과를 얻으려면 :

Map->contains 3 key-value 
"sc"="200" 
"msg"="something" 
"userInfo"=User(Object Class) 

어떻게 내가 할 수있는 이 작업을 수행? 또는 다른 JAR 도구 패키지를 사용하려면 어떻게해야합니까?

Map<String,Object> map = new ObjectMapper().readValue(json, Map.class); 

또는 POJO를 :

답변

8

당신은 당신이 얻을 수있을만큼 쉽다 "지정되지 않은"(지도,리스트, 래퍼), 원하는 경우 선택해야합니다. 문제는 매퍼가 실제로 "userInfo"를 특정 객체에 매핑하고 다른 값을 다른 객체에 매핑하려는 것을 알 수 없다는 것입니다.

하지만 오히려 단지와 같은 다른 클래스를 만들 것이다 :

public class Request { 
    public int sc; 
    public String message; 
    public User userInfo; 
    // and/or getters, setters, if you prefer 
} 

을하고 바인딩 :

Request req = new ObjectMapper().readValue(json, Request.class); 

왜 불편지도 엉망 당신이 바로, 실제 POJO를 가질 수 있습니까? 이지도에서 User 대상이 아닌 모든 것을 가지고 어떻게 든 것이 있다면 :)

+0

^_^hei hei! 정말 고마워요.하지만 알고 싶은 것은 그것을 얻을 수있는 방법이 있다는 것입니다. – YETI

+1

@JsonAnySetter 주석은 달성하려는 작업을 수행 할 수 있습니다. 나는 그 예를 올릴 것이다. –

3

는 StaxMan의 대답에 약간의 수정으로, 잭슨은 작업을 완수 할 수있는 @JsonAnySetter@JsonAnyGetter 주석을 제공합니다. 다음 예제에서는 이것이 어떻게 사용되는지를 보여줍니다.

import java.util.HashMap; 
import java.util.Map; 

import org.codehaus.jackson.annotate.JsonAnySetter; 
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    // {"sc":"200","msg":"something","userInfo":{"name":"n","password":"p"}} 
    String jsonInput = "{\"sc\":\"200\",\"msg\":\"something\",\"userInfo\":{\"name\":\"n\",\"password\":\"p\"}}"; 

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY); 

    Result result = mapper.readValue(jsonInput, Result.class); 
    System.out.println(result); 
    // output: 
    // Result: userInfo=User: name=n, password=p, otherThings={sc=200, msg=something} 
    } 
} 

class Result 
{ 
    Map otherThings = new HashMap(); 
    User userInfo; 

    @JsonAnySetter 
    void addThing(String key, Object value) 
    { 
    otherThings.put(key, value); 
    } 

    @Override 
    public String toString() 
    { 
    return String.format("Result: userInfo=%s, otherThings=%s", userInfo, otherThings); 
    } 
} 

class User 
{ 
    String name; 
    String password; 

    @Override 
    public String toString() 
    { 
    return String.format("User: name=%s, password=%s", name, password); 
    } 
} 
+0

-_- ||| 감사합니다. 그것은 강력하지만 제 요점과 일치하지 않습니다. – YETI

+0

나를 위해,이 새로운 작품에 중요한 새로운 HashMap(); ;) –