如何解决如何在Java中从JSON解析创建非静态列表?
我对Java还是比较陌生,并且在我目前正在从事的项目中遇到了问题。我正在尝试通过HTTP请求从UN Comtrade获取数据,然后将其解析为ArrayList。
我已经用下面的代码做到了这一点,但是我想做的是在此类中创建一个额外的“ getList”方法,以便可以从程序的其他部分调用列表。
但是,由于parse方法是静态的,因此我无法弄清楚该怎么做,因此它创建的列表不可访问。有人可以帮我吗?
我的主班:
public class Main {
public static void main(String[] args) {
ReporterArea reporterArea = new ReporterArea();
reporterArea.fetchReporterArea();
}
记者专区班级:
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpClient;
import java.net.URI;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONObject;
public class ReporterArea {
public void fetchReporterArea(){
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://comtrade.un.org/api/get?max=500&type=C&freq=A&px=HS&ps=2016&r=all&p=0&rg=2&cc=TOTAL")).build();
client.sendAsync(request,HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenApply(ReporterArea::parse)
.join();
}
public static String parse(String dataset){
JSONObject countries = new JSONObject(dataset);
ArrayList<String> list = new ArrayList<String>();
JSONArray array = countries.getJSONArray("dataset");
for (int i = 0; i < array.length(); i++){
String combined = array.getJSONObject(i).optString("rtTitle") + "; " + array.getJSONObject(i).optString("rtCode");
list.add(combined);
}
for (String i : list){
System.out.println(i);
}
return null;
}
}
解决方法
如果您不想更改api逻辑,则可以只创建一个私有List myList变量,然后在for块后的静态方法中将元素添加到列表中,然后编写
private static List<String> myList; //edit added static keyword after OP's comment
for (int i = 0; i < array.length(); i++){
String combined = array.getJSONObject(i).optString("rtTitle") + "; " + array.getJSONObject(i).optString("rtCode");
list.add(combined);
}
myList = new ArrayList<>(list);
之后,您可以创建一个公共的getter方法,如下所示:
public List<String> getList(){
if(myList !=null) {
return myList;
} else {
return new ArrayList<>();
}
}
您必须小心,并确保在解析后调用getList()方法
,如果需要获取已解析字符串的列表,则只需从parse
方法返回它即可,它可以是静态的,因为它不依赖于如上所述的任何实例数据。
然后,如果您确实需要异步检索数据,则可能还需要重构fetchReporterArea
以返回CompletableFuture<List<String>>
。
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpClient;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import org.json.JSONArray;
import org.json.JSONObject;
public class ReporterArea {
public CompletableFuture<List<String>> fetchReporterArea() {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(
"https://comtrade.un.org/api/get?max=500&type=C&freq=A&px=HS&ps=2016&r=all&p=0&rg=2&cc=TOTAL"))
.build();
return client.sendAsync(request,HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenApply(ReporterArea::parse);
}
public static List<String> parse(String dataset) {
JSONObject countries = new JSONObject(dataset);
List<String> list = new ArrayList<String>();
JSONArray array = countries.getJSONArray("dataset");
for (int i = 0; i < array.length(); i++) {
JSONObject row = array.getJSONObject(i);
list.add(row.optString("rtTitle") + "; " + row.optString("rtCode"));
}
return list;
}
}
然后方法main
应该更新如下:
public static void main(String[] args) throws InterruptedException,ExecutionException {
ReporterArea reporterArea = new ReporterArea();
CompletableFuture<List<String>> asyncResult = reporterArea.fetchReporterArea();
asyncResult.get().forEach(System.out::println);
}
输出(缩写)
Albania; 8
Algeria; 12
Andorra; 20
Angola; 24
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。