【问题标题】:How to get nested JSON content by key?如何按键获取嵌套的 JSON 内容?
【发布时间】:2020-08-09 03:55:40
【问题描述】:

我有以下代码用于从 URL 下载 JSON 文件:

static void getPost() throws Exception {
        String webPage = "https://www.reddit.com/r/arabfunny/top.json?limit=100";

        URL url = new URL(webPage);
        URLConnection request = url.openConnection();
        request.setRequestProperty("Content-Type", "application/json; utf-8");
        request.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");

        JsonParser jp = new JsonParser();
        JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
        JsonObject rootobj = root.getAsJsonObject();
        String imageURL = rootobj.get("data").toString();
        System.out.println(imageURL);
    }

这可以正确获取代码,但我无法获取超过第一级的数据,我可以使用 .get("data") 并且按预期工作,但我无法使用 .get("data").get("children")

可以在here找到JSON文件。

这里是漂亮的 JSON。

我想得到一个随机的孩子,我不知道孩子的数量。类似rootobj.get("data").get("children").get(RANDOM).toString();

编辑:

我真的只需要一个简单的解决方案来从随机孩子那里获取一些参数。

我需要获取 JSON -> 数据 -> 子项[随机项] -> 数据 -> subreddrit(或其他最终字段)

谁能给我一个基本的工作示例,它会给我任何最终值,然后我可以修改?

【问题讨论】:

    标签: java json


    【解决方案1】:

    对我来说,使用 Pojo 定义返回对象并使用 Gson 反序列化它更容易。

    Maven 依赖

    <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.3</version>
    </dependency>
    

    然后定义你的 Result Pojo

    public class MyResult{
    
       public Data data;
    
       //getter
    
    }
    

    //数据POJO

    public class Data{
    
          public String modhash;
          public Integer dist;
          public List<Children> children; //define your object
          public String after;
          public String before;
    
          //getters
          
       }
    

    儿童 POJO

    public class Children{
         private String kind;
         private String data; //You can define another Data Object if you want to
    
         //getters
         
         //toString() method.
    }
    

    注意:确保 JSON 字段名称与 POJO 字段名称完全相同。

    将 Json 字符串转换为对象:

    //get Json String from request : START
    InputStream inputStream = request.getInputStream();
           
    InputStreamReader isReader = new InputStreamReader(inputStream);
    //Creating a BufferedReader object
    BufferedReader reader = new BufferedReader(isReader);
    StringBuffer sb = new StringBuffer();
    String str;
    while((str = reader.readLine())!= null){
       sb.append(str);
    }
           
    String jsonString = sb.toString();
    //get Json String from request : END
            
    MyResult result = new Gson().fromJson(jsonString,MyResult.class)
    result.getData().getChildren()
        .get(0) //get index 0 from list
        .toString();
    

    如果你不想创建太多的 Pojos 层,创建你自己的 JsonAdapter。

    我没有对此进行测试,因此可能存在一些语法错误。

    您还可以查看JsonPath 库以使用点符号解析 json 文件。

    【讨论】:

      【解决方案2】:

      使用来自 maven 的 Jackson

      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.11.2</version>
      </dependency>
      
      ObjectMapper objectMapper = new ObjectMapper();
      JsonNode node = objectMapper.readValue(<OUTPUT_JSON>,JsonNode.class);
      rootobj.get("data").get("children")[INDEX].get(RANDOM).asText();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        • 2016-08-19
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多