Ошибка «не является JSONObject»: API, который возвращает этот формат в строке. Как я могу читать и создавать объекты из этого с помощью Java?

#java #json #api #rest #arraylist

#java #json #API #rest #arraylist

Вопрос:

Это запрос: https://api-pub.bitfinex.com/v2/candles/trade:1h:tBTCUSD/hist?limit=2 Это ответ:

[[1607630400000,18399,18415,18450.367075,18399,279.63699634],
[1607626800000,18290.48824022,18399,18400,18255,190.53601166]]

В другом посте кто-то сказал мне, что это Json… но когда я пытаюсь это сделать:

 public static void main(String[] args) throws IOException {
    String url = "https://api-pub.bitfinex.com/v2/candles/trade:1h:tBTCUSD/hist?limit=2";
    try {
        URL urlObj = new URL(url);
    
        HttpURLConnection conexion2 = (HttpURLConnection) urlObj.openConnection();
        conexion2.setRequestProperty("Accept-Language", "UTF-8");
        conexion2.setRequestMethod("GET");
        conexion2.connect();
        InputStreamReader in2 = new InputStreamReader(conexion2.getInputStream());
        BufferedReader br2 = new BufferedReader(in2);
        String output;
        output = br2.readLine();
        JSONArray array = new JSONArray(output);

        for (int i = 0; i < array.length(); i  ) {
            JSONObject object = array.getJSONObject(0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
 

вывод:

org.json.JSONException: JSONArray[0] не является JSONObject .

Может быть, мне не нужно преобразовывать эту строку в Json? Но как я могу преобразовать эту строку в массив или список?

Спасибо!

Комментарии:

1. Привет, вы просто получаете массив, JSON должен быть представлением структурированных данных, обычно у вас есть что-то вроде {value: [array], value2: {title: ‘другой объект’}} . в этом случае у вас просто есть массив массивов

2. Excelente, я тоже так думаю … Но сейчас… как я могу преобразовать эту строку в массив? извините, я знаю, что это просто, но я новичок в Java…

3. Я не получаю эту ошибку, выполняя строку JSONArray array = new JSONArray(response); , в которой response указаны данные, которые вы предоставили. Этот код работает нормально для меня. Однако, если я добавлю строку JSONObject obj = array.getJSONObject(0); , я получу сообщение об ошибке, о котором вы сообщаете. Пожалуйста, отредактируйте свой вопрос, чтобы включить код, в котором выдается ошибка: он определенно не выдается в строке, которую вы упоминаете.

4. ты прав!! посмотрите новый код, пожалуйста!!

Ответ №1:

Согласно вашему ответу

[[1607630400000,18399,18415,18450.367075,18399,279.63699634],
[1607626800000,18290.48824022,18399,18400,18255,190.53601166]]

У вас нет объекта json внутри JSONArray, у вас есть другой массив json. Вот фрагмент кода, который будет работать. Вы должны получить JSONArray внутри внешнего вида, а затем получить элементы внутри внутреннего массива. Это мое понимание того, чего вы пытаетесь достичь.

 String output = "[[1607630400000,18399,18415,18450.367075,18399,279.63699634], [1607626800000,18290.48824022,18399,18400,18255,190.53601166]]";
    JSONArray array = new JSONArray(output);
    for (int i = 0; i < array.length(); i  ) {
        JSONArray arr = array.getJSONArray(i);
        for (int j = 0; j < arr.length(); j  ) {
            if( arr.get(j) instanceof Double )
                System.out.println(arr.getDouble(j));
            else if( arr.get(j) instanceof Long )
                System.out.println(arr.getLong(j));
            else if( arr.get(j) instanceof String )
                System.out.println(arr.getString(j));
            else
                System.out.println(arr.get(j));
        }
    }
 

Комментарии:

1. Большое вам спасибо!!! теперь у меня другая проблема … jejeje несколько раз значения приходят с десятичной дробью, а иногда и нет… если я приведу значение Double, и оно не пришло с десятичным числом, я не могу этого сделать … вы понимаете?

2. @MatiasSolana Я обновил ответ выше. Вы можете использовать instanceof, чтобы увидеть тип значения, а затем вместо печати добавить свою логику