jsonlite和rjson包之间的根本区别是什么?

lh80um4z  于 2023-03-31  发布在  其他
关注(0)|答案(4)|浏览(155)

rjson::fromJSON()错误地读取了一个文件,而jsonlite::fromJSON()读取得很好。
test.json文件内容:

{"name": "Sanjay",
"unit_price": 130848,
"amount": 11,
"up_to_data_sales": 45725}

jsonlitefromJSON输出:

jsonlite::fromJSON("test.json")
$name
[1] "Sanjay"

$unit_price
[1] 130848

$amount
[1] 11

$up_to_data_sales
[1] 45725

但是同样的在rjson包中抛出错误。

rjson::fromJSON("test.json") 

Error in rjson::fromJSON("test.json") :   parseTrue: expected to see 'true' - likely an unquoted string starting with 't'.

1.为什么会出现这个错误?
1.在jsonlite存在的情况下推出rjson包的原因是什么?

3yhwsihp

3yhwsihp1#

井:

stringdist::stringdist("rjson", "jsonlite")
## [1] 5

这是一个适度的差异开始。
然而,你的说法似乎是错误的:

library(magrittr)

rjson::fromJSON('{"name": "Sanjay",
"unit_price": 130848,
"amount": 11,
"up_to_data_sales": 45725}') %>% str()
## List of 4
##  $ name            : chr "Sanjay"
##  $ unit_price      : num 130848
##  $ amount          : num 11
##  $ up_to_data_sales: num 45725

jsonlite::fromJSON('{"name": "Sanjay",
"unit_price": 130848,
"amount": 11,
"up_to_data_sales": 45725}') %>% str()
## List of 4
##  $ name            : chr "Sanjay"
##  $ unit_price      : int 130848
##  $ amount          : int 11
##  $ up_to_data_sales: int 45725

除了jsonlite使用更小的数字数据类型之外,它们都可以很好地解析JSON。
所以你的档案中有一个问题你没有在问题中披露。
另一个不正确的Assert

-rw-rw-r--  1 bob  staff      2690 Jul 30  2007 rjson_0.1.0.tar.gz
-rw-rw-r--  1 bob  staff    400196 Dec  3  2013 jsonlite_0.9.0.tar.gz

更不用说:

-rw-rw-r--  1 bob   staff   873843 Oct  4  2010 RJSONIO_0.3-1.tar.gz

rjson排在第一位。(目录列表来自坐在我旁边的CRAN镜子)。
你可以在这里阅读jsonlite背后的原理和动力:https://arxiv.org/abs/1403.2805(我从CRAN页面上获得了jsonlite

falq053o

falq053o2#

1)为什么会出现错误?-错误是由于语法错误

如果未给出“file=”命令,rjson不会读取文件,而使用Jsonlite阅读文件时,则不需要此命令

# For example:

 y <- rjson::fromJSON(file = "Input.json") 
 x <- jsonlite::fromJSON("Input.json")

2)在jsonlite存在的时候推出rjson包的原因是什么?
首先,rjson是在jsonlite之前推出的,其次,它们读取文件的方式有所不同:
例如,考虑以下输入:
{“id”:1,“prod_info”:[ {“产品”:“xyz”,“brand”:“pqr”,“price”:500 },{“product”:“abc”,“brand”:“klm”,“price”:5000个
上面输入的prod_info是一个有2个向量的列表,但是jsonlite是以dataframe的形式读取的,而rjson是以列表的形式读取的
输出:

x
$id
[1] 1

$prod_info
  product brand price
1     xyz   pqr   500
2     abc   klm  5000

y
$id
[1] 1

$prod_info
$prod_info[[1]]
$prod_info[[1]]$product
[1] "xyz"

$prod_info[[1]]$brand
[1] "pqr"

$prod_info[[1]]$price
[1] 500

$prod_info[[2]]
$prod_info[[2]]$product
[1] "abc"

$prod_info[[2]]$brand
[1] "klm"

$prod_info[[2]]$price
[1] 5000

class(x$prod_info)
[1] "data.frame"

class(y$prod_info)
[1] "list"
kcugc4gi

kcugc4gi3#

这个问题已经得到了回答,但是关于两个包之间的差异,我最近被一个咬了一口:如何处理空字典。
关于rjson

> rjson::fromJSON("[]")
list()
> rjson::fromJSON("{}")
list()

而对于jsonlite:

> jsonlite::fromJSON("[]")
list()
> jsonlite::fromJSON("{}")
named list()

也就是说,使用rjson,你无法区分空列表和空字典。
然而,到JSON的转换对两者都有效,例如toJSON(structure(list(), names=character(0)))产生"{}"

ilmyapht

ilmyapht4#

这个区别让我选择了jsonlite

all.equal(mtcars, jsonlite::fromJSON(jsonlite::toJSON(mtcars)))
# Outputs
[1] TRUE

然而:

all.equal(mtcars, rjson::fromJSON(rjson::toJSON(mtcars)))
# Outputs
[1] "Attributes: < names for target but not for current >"              "Attributes: < Length mismatch: comparison on first 0 components >"

相关问题