簡體   English   中英

使用Jackson解析器從JSON代碼獲取屬性

[英]Getting attributes from JSON code with Jackson Parser

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

[
    {
        "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”對象中,我還有另一個“ user”對象,當解析器遇到用戶對象的}時,它認為它是整個tweet對象的} 您能告訴我如何解決這種情況嗎?

為什么要嘗試使用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

您可能應該按照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");
}   

這是更新的代碼,它將起作用。 您需要考慮user fieldName並將其單獨解析,因此用戶對象的}不會被視為根對象的結尾

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());
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM