2012-08-07 99 views
0

當LinkedIn REST API打交道,很多領域都有類似這樣的格式:與LinkedIn REST API傑克遜對象映射方法

"positions": 
{ 
    "_total": 1, 
    "values": [{"title": "Software Developer"}] 
} 

代替:

"positions": 
{ 
    [{"title": "Software Developer"}] 
} 

這導致了很多當我嘗試將json映射到Position對象時遇到問題。我用傑克遜Java解析JSON響應。有沒有辦法設置對象映射器,以便它會自動忽略「_total」和「values」字段?

回答

1

我認爲不可能配置ObjectMapper自動執行此操作。

你可以嘗試沿着這些線路寫你自己的解析器,東西:

JsonFactory f = new JsonFactory(); 
JsonParser jp = f.createJsonParser(new File("positions.json")); 
List<Position> positions = new LinkedList<Position>(); 
jp.nextToken(); // will return JsonToken.START_OBJECT (verify?) 
while (jp.nextToken() != JsonToken.END_OBJECT) { 
    String fieldname = jp.getCurrentName(); 
    jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY 
    if ("positions".equals(fieldname)) { // contains an object 
    Position pos = new Position(); 
    while (jp.nextToken() != JsonToken.END_OBJECT) { 
     String namefield = jp.getCurrentName(); 
     jp.nextToken(); // move to value 
     if ("value".equals(namefield)) { 
     pos.setValue(jp.getText()); 
     } 
    } 
} 
jp.close(); 
1

顯然@kpentchev提供了一個可行的解決這個問題,但我個人傾向於避免手動解析器儘可能。在這種情況下,我最後寫一類包裝類的映射生JSON:

public class PositionWrapper 
{ 
    private Long _total; 
    private List<Position> values; 

    //setter and getter 
} 

雖然這是一個有點多餘這種方式,但它避免了手工包裝去。適用於我,即使是嵌套對象。

+0

這是我首先想到的,但不知怎的,我不喜歡存儲不必要的_total值。 – kpentchev 2012-08-08 06:55:35