有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

http如何从java中的JSON解析创建非静态列表?

我对Java还比较陌生,在我目前正在进行的项目中遇到了一个问题。我试图通过HTTP请求从UN Comtrade获取数据,然后将其解析为ArrayList

我已经用下面的代码实现了这一点,但接下来我想做的是在这个类中创建一个额外的“getList”方法,这样我就可以从程序的其他部分调用list

然而,我不知道该怎么做,因为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;
    }
}

共 (1) 个答案

  1. # 1 楼答案

    如果不想更改api逻辑,只需创建一个private 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()方法