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

时间:2018-11-19 17:36:12

标签: r json

rjson :: fromJSON()会错误地读取文件,而jsonlite :: fromJSON()会很好地读取文件。这是一个示例示例。

文件test.json内容:

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

jsonlite fromJSON的输出:

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. 为什么会出现此错误?
  2. 存在rjson时启动jsonlite软件包的原因是什么?

3 个答案:

答案 0 :(得分:2)

嗯:

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。

因此您的文件存在问题,您未能在问题中予以披露。

进一步的错误主张

-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(我从jsonlite的CRAN页面中退出。

答案 1 :(得分:0)

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”:[       {          “ product”:“ xyz”,          “ brand”:“ pqr”,          “价格”:500       },       {          “ product”:“ abc”,          “ brand”:“ klm”,          “价格”: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"

答案 2 :(得分:0)

这个问题已经回答了,但是关于这两个包的区别,我最近被一个问题咬了一口:空字典是如何处理的。

使用 rjson

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

然而,使用 jsonlite:

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

也就是说,使用 rjson,您无法区分空列表和空字典。

JSON 的转换同时适用于两者,例如toJSON(structure(list(), names=character(0))) 产生 "{}"