2011-12-06 54 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工具包?

回答

8

你必須選擇,如果你想要的「類型化」(地圖,列表,包裝),這是很容易得到:

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

或POJO的。事情是,mapper真的不知道你想要「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,對不對? :)

+0

^_ ^嘿嘿!非常感謝,但我真的想知道是否有一些方法可以獲得它。 – YETI

+1

@JsonAnySetter註釋可能會做你正在嘗試完成的事情。我會舉一個例子。 –

3

作爲對StaxMan答案的一個微小修改,如果某種地圖中的所有對象都不是User,Jackson會提供@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(); ;) –