解析 JSON uint32/uint64 Java 中的数字

Parse JSON uint32/uint64 numbers in Java

我想解析一些作为数字(不带引号)发送的 uint32 和 uint64 格式的 JSON 数据,然后在 java.

中使用它们

我发现我可以通过 parseUnsignedInt(String) 方法将它们存储为无符号整数,但问题是我无法获得 json 值一个字符串,因为它缺少引号。如果我将它解析为 int,在我有机会转换它之前返回的值是错误的。

示例:

// 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 对象中提取值作为字符串(或任何其他不会破坏它的方法)?

据我所知,无法将 json-numbers 读取为字符串(只要使用标准库)。

但我想,最后,你想要处理数字,所以,将它们转换成字符串可能不方便。

相反,您可以读取为 json-number,然后处理数字而不是字符串:

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

从这里开始,您可以根据需要将其转换为 uint32。

希望对您有所帮助。

假设使用的库是org.jsongetLong 方法不支持 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
    }
}