2013-05-22 98 views
0

如何使用jackson將JSON屬性名稱映射到Java字段值?如何將Json屬性名稱映射到Java字段值

此:

{ "list":[ { "monday":[ "apple", "bread"] } , 
      { "sunday":[ "bacon", "beer" ] } ], 
    "kind":"shoplist" } 

這樣:

public class StuffList { 
    public List<Stuff> list; 
    public String kind; 
} 

public class Stuff { 
    public String name; 
    public List<String> items; 
} 

"monday":[ "apple", "bread"]被映射到兩個變量,一個與該屬性名和另一個與所述屬性值的片段。

+2

有這樣的一個例子[傑克遜教程](http://wiki.fasterxml.com/JacksonInFiveMinutes) –

+0

編輯的問題,使其更清晰 –

+0

無論如何,沒有發現如何做到這一點在教程 –

回答

1

您的JSON代表簡單的地圖列表,更確切地說:List<Map<String, List<String>>>。您可以在此JSON轉換成該POJO:

class JsonEntity { 

    public List<Map<String, List<String>>> list; 
    public String kind; 

    public StuffList toStuffList() { 
     StuffList stuffList = createStuffListObject(); 

     return stuffList; 
    } 

    private StuffList createStuffListObject() { 
     StuffList stuffList = new StuffList(); 
     stuffList.kind = kind; 
     stuffList.list = createItemsList(); 

     return stuffList; 
    } 

    private List<Stuff> createItemsList() { 
     List<Stuff> items = new ArrayList<Stuff>(list.size()); 
     for (Map<String, List<String>> item : list) { 
      items.add(convertToStuff(item)); 
     } 

     return items; 
    } 

    private Stuff convertToStuff(Map<String, List<String>> item) { 
     Stuff stuff = new Stuff(); 
     stuff.name = item.keySet().iterator().next(); 
     stuff.items = item.values().iterator().next(); 

     return stuff; 
    } 
} 

現在我們可以用這種方式反序列化JSON:

public static void main(String[] args) throws Exception { 
    String json = "{\"list\":[{\"monday\":[\"apple\", \"bread\"]},{\"sunday\":[\"bacon\", \"beer\"]} ],\"kind\":\"shoplist\"}"; 

    ObjectMapper objectMapper = new ObjectMapper(); 
    JsonEntity jsonEntity = objectMapper.readValue(json, JsonEntity.class); 
    System.out.println(jsonEntity.toStuffList()); 
} 

輸出的程序:

list=[[name=monday, items=[apple, bread]], [name=sunday, items=[bacon, beer]]], kind=shoplist 
+0

似乎沒有直接映射到強類型的自然支持,但您的解決方案非常優雅,將使用它。 –

0

使用註釋@JsonProperty如果您想要使用參數更改名稱使用註釋,例如@JsonProperty("stuff_name")

+0

這個例子確實有誤導性,我把它編輯得更清楚 –

+0

我希望這個例子澄清說它不是一個直接的字段到字段映射。 –

相關問題