这是 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
在 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仍然会将小整数读为普通数字,而只会将这些太大的整数读为字符串。
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |