通过使用 jsonlite 转换包含大量数字的 json 字符串得到错误的结果

Chr*_*phe 4 json r jsonlite

这是 MWE,如何获得正确的数字作为字符。

require(jsonlite)

j <- "{\"id\": 323907258301939713}"
a <- fromJSON(j)

print(a$id, digits = 20)
class(a$id)

a$id <- as.character(a$id)
a$id
class(a$id)
Run Code Online (Sandbox Code Playgroud)

这是输出。

Loading required package: jsonlite
Loading required package: methods
[1] 323907258301939712
[1] "numeric"
[1] "323907258301939712"
[1] "character"
Run Code Online (Sandbox Code Playgroud)

我想获得确切的数字323907258301939713作为字符a

K. *_*uhr 5

在 JavaScript 中,数字是双精度浮点数,即使它们看起来像整数,所以它们只有大约 16 位十进制数字的精度。特别是,JavaScript 代码:

console.log(12345678901234567 == 12345678901234568)
Run Code Online (Sandbox Code Playgroud)

打印“真”。

JSON 标准从 JavaScript 继承了此限制,因此jsonlite通过将数字读取为双精度值实际上可以正确解释您的 JSON。

因为这实际上是 JSON 标准的一个限制,如果您可以控制生成 JSON 的程序,那么如果您修复您的 JSON(例如,通过将id属性表示为字符串),您将省去自己的痛苦和心痛:

{ "id": "323907258301939713" }
Run Code Online (Sandbox Code Playgroud)

但是,如果您绝对必须解析这个格式错误的 JSON,那么您很幸运。该fromJSON函数采用一个未公开的布尔参数bigint_as_char,将这些大数字作为字符值读入 R:

>     a <- fromJSON(j, bigint_as_char=TRUE)
>     print(a$id)
[1] "323907258301939713"
> 
Run Code Online (Sandbox Code Playgroud)

但是,您必须准备好在 R 代码的其余部分中处理普通数字和字符值,因为fromJSON仍然会将整数读为普通数字,而只会将这些太大的整数读为字符串。