Разбор JSON номеров uint32 / uint64 в Java - PullRequest
2 голосов
/ 23 марта 2020

Я хочу проанализировать некоторые JSON данные в формате uint32 и uint64, которые отправляются в виде чисел (без кавычек), а затем использовать их в java.

Я обнаружил, что могу их сохранить как целые числа без знака с помощью метода parseUnsignedInt (String) , но проблема в том, что я не могу получить значение json в виде строки, поскольку в нем отсутствуют кавычки. Если я проанализирую его как целое, возвращенное значение будет неправильным, прежде чем я смогу его преобразовать.

Пример:

// data is a JSONObject containing: {"number" : 4294967294}
...
System.out.println(data.getInt("number"));
// returns: -10001
System.out.println(Integer.parseUnsignedInt(data.getString("number")));
// returns: JSONObject["number"] not a string.
System.out.println(Integer.parseUnsignedInt(Integer.toString(data.getInt("number"))));
// returns: Illegal leading minus sign on unsigned string -10001.

Есть ли способ извлечь значение из json объект как строка (или любой другой способ, который не разрушает ее)?

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Предположим, библиотека использует org.json. getLong метод не может поддерживать uint64. Мы должны использовать getBigInteger в таком случае.

import org.json.JSONObject;

public class JsonParseLargeInteger {
    public static void main(String[] args) {
        String uint32MaxValueJson = "{\"number\" : 4294967296}";
        JSONObject uint32MaxValueJsonObject = new JSONObject(uint32MaxValueJson);
        System.out.println(((Integer) uint32MaxValueJsonObject.getInt("number")).toString());
        // Result is 0
        System.out.println(((Long) uint32MaxValueJsonObject.getLong("number")).toString());
        // Result is 4294967296
        System.out.println(uint32MaxValueJsonObject.getBigInteger("number").toString());
        // Result is 4294967296

        String uint64MaxValueJson = "{\"number\" : 18446744073709551615}";
        JSONObject uint64MaxValueJsonObject = new JSONObject(uint64MaxValueJson);
        System.out.println(((Integer) uint64MaxValueJsonObject.getInt("number")).toString());
        // Result is -1
        System.out.println(((Long) uint64MaxValueJsonObject.getLong("number")).toString());
        // Result is -1
        System.out.println(uint64MaxValueJsonObject.getBigInteger("number").toString());
        // Result is 18446744073709551615
    }
}
1 голос
/ 23 марта 2020

Насколько я знаю, нет способа читать json -значения как строки (при условии, что используются стандартные библиотеки).

Но я думаю, наконец, вы хотите обработать числа, так что преобразование их в строку может быть неудобным.

Вместо этого вы можете читать как json -номер и затем обрабатывать числа вместо строк:

final JsonNumber jsonNumber = data.getJsonNumber("number");
System.out.println(jsonNumber.longValue());
// returns: 4294967294

С этого момента вы можете конвертировать его в uint32, как вам нравится.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...