英文:
How to get nested JSON content by key?
问题
以下是要翻译的代码部分:
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")
来获取第二层数据。
您可以尝试使用以下方式来获取随机子项(children),其中您不知道子项数量:
rootobj.get("data").getAsJsonObject().getAsJsonArray("children").get(RANDOM_INDEX).toString();
请注意,您需要将RANDOM_INDEX
替换为实际的随机索引值。
如果您只需要从随机子项获取一些参数,您可以按照以下方式进行操作:
JsonObject data = rootobj.get("data").getAsJsonObject();
JsonArray children = data.getAsJsonArray("children");
int randomIndex = /* 生成随机索引的代码 */;
JsonObject randomChild = children.get(randomIndex).getAsJsonObject();
String subreddit = randomChild.get("data").getAsJsonObject().get("subreddit").getAsString();
请将上述代码中的/* 生成随机索引的代码 */
替换为生成随机索引的实际代码。这将帮助您获取到从随机子项中获取的 subreddit(或其他最终字段)的值。
英文:
I have the following code which I use to download a JSON file from a URL:
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);
}
This correctly gets the code but I'm having trouble getting data past the first level, I can use .get("data")
and that works as expected but I cannot do .get("data").get("children")
.
The JSON file can be found here.
Here is the JSON prettyfied.
I want to get a random children where I don't know the number of children. Something like rootobj.get("data").get("children").get(RANDOM).toString();
EDIT:
I really just need a simple solution to get a few parameters from a random children.
I need to get JSON -> data -> children[random item] -> data -> subreddrit (or other final field)
Can anyone show me a basic working example that would give me any final value which I can then modify?
答案1
得分: 1
使用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();
英文:
Use Jackson from maven
<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();
答案2
得分: 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
}
Data POJO
public class Data {
public String modhash;
public Integer dist;
public List<Children> children; // 定义你的对象
public String after;
public String before;
//getters
}
Children POJO
public class Children {
private String kind;
private String data; // 如果需要的话,你可以定义另一个 Data 对象
//getters
//toString() 方法。
}
注意: 确保 JSON 字段名与 POJO 字段名完全相同。
将 Json 字符串转换为对象:
// 从请求获取 Json 字符串:开始
InputStream inputStream = request.getInputStream();
InputStreamReader isReader = new InputStreamReader(inputStream);
// 创建 BufferedReader 对象
BufferedReader reader = new BufferedReader(isReader);
StringBuffer sb = new StringBuffer();
String str;
while((str = reader.readLine()) != null) {
sb.append(str);
}
String jsonString = sb.toString();
// 从请求获取 Json 字符串:结束
MyResult result = new Gson().fromJson(jsonString, MyResult.class);
result.getData().getChildren()
.get(0) // 从列表中获取索引 0
.toString();
如果你不想创建太多层次的 Pojo,可以创建自己的 JsonAdapter。
我没有测试过这段代码,所以可能存在一些语法错误。
此外,你还可以查看 JsonPath
库,使用点符号表示法解析 JSON 文件。
英文:
For me it is easier to define your return object using Pojo and use Gson to deserialize it.
Maven dependency
<!-- 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>
Then define your Result Pojo
public class MyResult{
public Data data;
//getter
}
//Data POJO
public class Data{
public String modhash;
public Integer dist;
public List<Children> children; //define your object
public String after;
public String before;
//getters
}
Children POJO
public class Children{
private String kind;
private String data; //You can define another Data Object if you want to
//getters
//toString() method.
}
NOTE: Make sure that JSON field names are exactly the same as POJO field names.
To convert Json string to object:
//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();
If you do not want to create too many layer of Pojos, create your own JsonAdapter.
I haven't tested this so there might be some syntax error.
Also you can look at JsonPath
library for parsing json file using dot notation.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论