【问题标题】:Java JSON -Jackson- Nested ElementsJava JSON -Jackson- 嵌套元素
【发布时间】:2011-12-05 16:41:29
【问题描述】:

我的 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"));

    }
}

【问题讨论】:

  • 这是意料之中的:'status' 的 va;ue 是一个 Map 不是吗?您只需要使用“retweet_count”再调用一次“get()”。但是,我同意其中一个建议使用readTree() 来获得JsonNode 的回复——更容易遍历。

标签: java json jackson


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    尝试类似的方法。如果你使用 JsonNode,你的生活会更轻松。

    JsonNode node = mapper.readValue("[{\"listed_count\":1720,\"status\":{\"retweet_count\":78}}]]", JsonNode.class);
    
    System.out.println(node.findValues("retweet_count").get(0).asInt());
    

    【讨论】:

      【解决方案3】:

      你可能可以做到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"));

      您没有配对的 Map,您有 &lt;String, Map&lt;String, Object&gt;&gt; 配对的 Map。

      编辑 2:

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

      所以试试这个:

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

      【讨论】:

      • 我试过了,还是不行。 get("status") 是一个普通对象
      • 更多错误兄弟,:Can not deserialize instance of java.util.LinkedHashMap out of VALUE_NUMBER_INT token
      猜你喜欢
      • 2021-06-16
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多