Java JSON -Jackson-嵌套元素

时间:2011-12-05 16:41:30

标签: java json jackson

我的JSON字符串具有嵌套值。

这样的东西

"[{"listed_count":1720,"status":{"retweet_count":78}}]"

我想要retweet_count的价值。

我正在使用杰克逊。

以下代码输出“{retweet_count=78}”而不是78。我想知道我是否能以PHP的方式获得嵌套值,即status->retweet_count。感谢。

import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;

public class tests {
public static void main(String [] args) throws IOException{
    ObjectMapper mapper = new ObjectMapper();
  List <Map<String, Object>> fwers = mapper.readValue("[{\"listed_count\":1720,\"status\":{\"retweet_count\":78}}]]", new TypeReference<List <Map<String, Object>>>() {});
    System.out.println(fwers.get(0).get("status"));

    }
}

3 个答案:

答案 0 :(得分:12)

如果您知道要检索的数据的基本结构,那么正确表示它是有意义的。你会得到类型安全等各种细节;)

public static class TweetThingy {
    public int listed_count;
    public Status status;

    public static class Status {
        public int retweet_count;
    }
}

List<TweetThingy> tt = mapper.readValue(..., new TypeReference<List<TweetThingy>>() {});
System.out.println(tt.get(0).status.retweet_count);

答案 1 :(得分:9)

尝试类似的东西。如果你使用JsonNode,你的生活会更容易。

JsonNode node = mapper.readValue("[{\"listed_count\":1720,\"status\":{\"retweet_count\":78}}]]", JsonNode.class);

System.out.println(node.findValues("retweet_count").get(0).asInt());

答案 2 :(得分:2)

你可以做System.out.println(fwers.get(0).get("status").get("retweet_count"));

编辑1:

更改

List <Map<String, Object>> fwers = mapper.readValue(..., new TypeReference<List <Map<String, Object>>>() {});

List<Map<String, Map<String, Object>>> fwers = mapper.readValue(..., new TypeReference<List<Map<String, Map<String, Object>>>>() {});

然后执行System.out.println(fwers.get(0).get("status").get("retweet_count"));

您没有成对地图,您有<String, Map<String, Object>>对的地图。

编辑2:

好吧,我明白了。所以你有一张地图清单。在列表的第一个映射中,您有一个kv对,其中值是一个整数,另一个kv对,其中值是另一个映射。当你说你有一张地图的地图列表时,它会抱怨,因为带有int值的kv对不是一个map(它只是一个int)。因此,您必须制作所有kv对映射(将该int更改为映射),然后使用上面的编辑。或者您可以使用原始代码,但在您知道它是地图时将其转换为地图。

所以试试这个:

Map m = (Map) fwers.get(0).get("status");
System.out.println(m.get("retweet_count"));