【问题标题】:Importing, editing and saving JSON in a simple way?以简单的方式导入、编辑和保存 JSON?
【发布时间】:2021-12-05 14:22:33
【问题描述】:

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

我的出发点是:modify-json-file-using-some-condition-and-create-new-json-file-in-r

事实上,我想做一些更简单的事情,但它仍然不起作用!我正在使用 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"

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

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 很陌生,这真的很令人沮丧!

有什么想法吗?

谢谢

【问题讨论】:

  • 接近但不太可重现。您能否提供以下一项或两项: (1) JSON 文件的原始内容; (2) dput(json_list) 和/或 dput(json_modified)。谢谢!
  • 问题:您是否也附上了RJSONIO 包?如果是这样,对toJSON() 的调用可能不明确:jsonlite::toJSON()RJSONIO::toJSON()。也就是说,在调用 jsonlite::write_json() 之前,您不需要使用 toJSON()
  • dput(json_list) 给出:list(Apples = list(Origin = list(Id = 2615L, season = "Fall")), Oranges = list(Origin = list(Id = 2615L, airportLabel = "Orange airport"), Shipping = list(ShipperId = 123L, ShipperLabel = "Brighter Orange"))) dput(json_modified) ...没有 toJSON ...给出:list(Apples = list(Origin = list(Id = 1234 , season = "Fall")), Oranges = list(Origin = list(Id = 4567, airportLabel = "Orange airport"), Shipping = list(ShipperId = 123L, ShipperLabel = "Suntan"))) 如果我之前运行 toJSON dput() 我转义字符
  • RJSONIO 包未使用
  • @Greg 移除 toJSON() 解决了这个问题。非常感谢

标签: r json jsonlite


【解决方案1】:

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

背景

jsonlite 包中,存在互逆函数:

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

JSON 字符串、URL 或文件

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

除了 [that] 他们明确区分路径和文字输入,并且默认情况下不简化。

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

所以toJSON(fromJSON(txt = ...)) 应该原封不动地返回传递给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 返回值被传递(在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)

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 2011-08-18
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多