以简单的方式导入、编辑和保存 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
包中,存在互逆函数:
jsonlite::fromJSON()
从原始文本(JSON 格式)转换为 R 对象。
jsonlite::toJSON()
将 R 对象转换为原始文本(JSON 格式)。
现在这个原始文本 (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)
我在编辑 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
包中,存在互逆函数:
jsonlite::fromJSON()
从原始文本(JSON 格式)转换为 R 对象。jsonlite::toJSON()
将 R 对象转换为原始文本(JSON 格式)。
现在这个原始文本 (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)