2013-01-08 11 views
1

我想使用Jackson JSON parser解析JSON字符串。我想解析的JSON代碼包含一個數組,其中有一個對象。從這個對象,我想提取textretweet_count屬性:使用Jackson Parser從JSON代碼獲取屬性

[ 
    { 
     "created_at": "Tue Jan 08 08:19:58 +0000 2013", 
     "id": 288560667345178600, 
     "text": "test tweet", 
     "source": "web", 
     "truncated": false, 
     "user": { 
      "id": 941802900, 
      "id_str": "941802900", 
      "location": "" 
     }, 
     "contributors": null, 
     "retweet_count": 0, 
     "favorited": false, 
     "retweeted": false 
    } 
] 

我嘗試使用此代碼做到這一點:

JsonFactory f = new JsonFactory(); 
JsonParser jp = f.createJsonParser(str); 

boolean first = true; 

while (jp.nextValue() != JsonToken.END_ARRAY) { 
    Tweet tweet = new Tweet(); 
    while (jp.nextToken() != JsonToken.END_OBJECT) { 
     String fieldName = jp.getCurrentName(); 
     jp.nextToken(); 

      if (fieldName.equals("text")) { 
      tweet.setText(jp.getText()); 
     } else if (fieldName.equals("retweet_count")) { 
      tweet.setRetweetCount(jp.getValueAsLong()); 
     } 
    } 
} 

但是,我沒有得到預期的結果。我認爲問題在於'tweet'對象中有另一個'用戶'對象,當解析器遇到用戶對象的}時,它認爲它是整個tweet對象的}。你能告訴我如何解決這種情況?

+0

你怎麼得到這個JSON響應的結束?請幫助我獲得微博鳴叫的轉推次數? – OMAK

回答

1

爲什麼您嘗試使用Streaming API而不是樹模型或數據綁定,是否有特殊原因?後兩者可能導致更簡單的代碼。例如:

@JsonIgnoreProperties(ignoreUnknown=true) // so we only include ones we care about 
public class Tweet { 
    String text; 
    int retweet_count; 
} 

ObjectMapper mapper = new ObjectMapper(); // reusable (please reuse, expensive to create) 
Tweet tweet = mapper.readValue(json, Tweet.class); 

System.out.println("Tweet with text '"+tweet.text+"', retweet count of "+tweet.retweet_count); 

與數據綁定。並與樹模型:

ObjectNode root = mapper.readTree(json); 
String text = root.path("text").getText(); 
// and so on 
0

你或許應該做些什麼StaxMan建議和對象數據模型正確,但最快的方法,我知道要得到你想要的數據是一樣的東西下面的代碼示例。

List<Map<String, Object>> val = readValue(json, new TypeReference<List<Map<String, Object>>>() { }); 
for (Map<String, Object>> map : val) { 
    String tweet = map.get("text"); 
    Integer retweetCount = map.get("retweet_count"); 
} 
0

這裏是更新的代碼,它將工作。你需要考慮user字段名,並分別解析它,所以用戶對象的}不會被視爲根對象

while (jp.nextValue() != JsonToken.END_ARRAY) { 
    Tweet tweet = new Tweet(); 
    while (jp.nextToken() != JsonToken.END_OBJECT) { 
     String fieldName = jp.getCurrentName(); 
     jp.nextToken(); 

     if (fieldName.equals("user")) { 
      //Here the current token in BEGIN_OBJECT 
      while (jp.nextToken() != JsonToken.END_OBJECT) { 
       //You can use the user properties here 
      } 
     } else if (fieldName.equals("text")) { 
      tweet.setText(jp.getText()); 
     } else if (fieldName.equals("retweet_count")) { 
      tweet.setRetweetCount(jp.getValueAsLong()); 
     } 
    } 
}