以简单的方式导入、编辑和保存 JSON?

Importing, editing and saving JSON in a simple way?

我在编辑 JSON 文件并将结果保存为可用格式时遇到问题。

我的出发点是:

其实我想做更简单的,还是不行!我正在使用 jsonlite 包。

等效样本如下所示...

$Apples
$Apples$Origin
$Apples$Origin$Id
[1] 2615

$Apples$Origin$season
[1] "Fall"

$Oranges
$Oranges$Origin
$Oranges$Origin$Id
[1] 2615

$Oranges$Origin$airportLabel
[1] "Orange airport"

$Oranges$Shipping
$Oranges$Shipping$ShipperId
[1] 123

$Oranges$Shipping$ShipperLabel
[1] "Brighter Orange"

我读取了文件,进行了一些更改并将生成的文件保存回硬盘。没有比这更简单的了吧?

json_list = read_json(path = "../documents/dummy.json")

json_list$Apples$Origin$Id = 1234
json_list$Oranges$Origin$Id = 4567
json_list$Oranges$Shipping$ShipperLabel = "Suntan Blue"

json_modified <- toJSON(json_list, pretty = TRUE)

write_json(json_modified, path = "../documents/dummy_new.json")

json_list 在 Rstudio 文件类型列下显示为字符格式。
json_modified 在 Rstudio 文件类型栏下显示为 json 格式。

为什么会有这种差异?

现在,如果我 运行 原始文件可以正常工作,但修改后的文件会失败。 JSON 格式检查出来了,我看不到任何错误。

实际文件比上面的例子大,但我用的方法是一样的。

我编辑或保存文件的方式有问题吗?

我是 JSON 的新手,这真令人沮丧!

有什么想法吗?

谢谢

在没有可重现数据的情况下,我至少可以诊断出一个潜在问题。

背景

jsonlite 包中,存在互逆函数:

现在这个原始文本 (txt) 可能是

a JSON string, URL or file

至于jsonlite::read_json() and jsonlite::write_json(),也是一对互逆,和前一对一样

except [that] they explicitly distinguish between path and literal input, and do not simplify by default.

也就是说,后者只是设计用于处理文件(路径)而不是原始文本字符串。

所以 toJSON(fromJSON(txt = ...)) 应该 return 不改变传递给 txt 的文本,就像 write_json(read_json(path = ...)) 应该写一个与传递给 path 的文件相同的文件一样。

简而言之,toJSON()属于fromJSON();而 write_json() 属于 read_json().

问题

但是,您通过将 toJSON()read_json()write_json() 混合添加了一个虚假步骤:

json_list = read_json(...)

# ...
json_modified <- toJSON(json_list, ...) # SPURIOUS STEP
# ...

write_json(json_modified, ...)

你看,write_json() 已经将“转换为JSON”,所以toJSON()完全没有必要。事实上,toJSON() 实际上 破坏了 这个过程,因为它的 textual return 值被传递(在 json_modified) 到 write_json(),它期望(结构)R 对象 而不是文本。

修复

修改完json_list,直接开始写:

json_list = read_json(path = "../documents/dummy.json")

json_list$Apples$Origin$Id = 1234
# Further modifications...

write_json(json_list, path = "../documents/dummy_new.json", pretty = TRUE)