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

Это просьба: 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? Но как я могу преобразовать эту строку в массив или список?

Спасибо!

Привет, вы просто получаете массив, JSON должен быть представлением структурированных данных, обычно у вас есть что-то вроде {значение: [массив], значение2: {название: 'другой объект'}}. в этом случае у вас просто массив массивов

Camilo Casadiego 23.12.2020 15:38

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

Matias Solana 23.12.2020 15:46

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

Luke Woodward 23.12.2020 17:01

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

Matias Solana 23.12.2020 19:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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));
        }
    }

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

Matias Solana 24.12.2020 18:24

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

A Paul 24.12.2020 19:15

Другие вопросы по теме