用R中的jsonlite读写json



任务是加载json,处理一些数据并写回。第一步是使用相同的输出和输入读取和写入json文件,但事实并非如此。这里有一个测试文件,它总结了问题:

{
"hourly": [
{
"Temperatur": {
"Datum": ["2021-09-24 21:00:00", "2021-09-24 22:00:00"],
"Vorhersage": [14.82, 14.83],
"Referenz": [16.6, 16.2],
"DWD_Name": ["Elpersbüttel", "Elpersbüttel"],
"Export": [17.2, 16.71],
"color": ["rgb(0,128,0)", "rgb(0,128,0)"],
"Status": ["ok", "ok"],
"min": [13.05, 12.81],
"max": [17, 17]
}},
{
"Temperatur2": {
"Datum": ["2021-09-24 21:00:00", "2021-09-24 22:00:00"],
"Vorhersage": [13.82, 14.83],
"Referenz": [16.6, 16.2],
"DWD_Name": ["Elpersbüttel", "Elpersbüttel"],
"Export": [17.2, 16.71],
"color": ["rgb(0,128,0)", "rgb(0,128,0)"],
"Status": ["ok", "ok"],
"min": [13.05, 12.81],
"max": [17, 18]
}
}
]
}

然而,jsonlite改变了数据结构:

library(jsonlite)
id = "test3" # my testfile
setwd("/path/")
myjs = fromJSON(paste0(id,".json"),simplifyVector = T) 
write_json(myjs, paste0(id,"_.json"), pretty = T) # output file 'test3_.json'

我得到的结果是:

{
"hourly": [
{
"Temperatur": {
"Datum": ["2021-09-24 21:00:00", "2021-09-24 22:00:00"],
"Vorhersage": [14.82, 14.83],
"Referenz": [16.6, 16.2],
"DWD_Name": ["Elpersbüttel", "Elpersbüttel"],
"Export": [17.2, 16.71],
"color": ["rgb(0,128,0)", "rgb(0,128,0)"],
"Status": ["ok", "ok"],
"min": [13.05, 12.81],
"max": [17, 17]
},
"Temperatur2": {
"Datum": {},
"Vorhersage": {},
"Referenz": {},
"DWD_Name": {},
"Export": {},
"color": {},
"Status": {},
"min": {},
"max": {}
}
},
{
"Temperatur": {
"Datum": {},
"Vorhersage": {},
"Referenz": {},
"DWD_Name": {},
"Export": {},
"color": {},
"Status": {},
"min": {},
"max": {}
},
"Temperatur2": {
"Datum": ["2021-09-24 21:00:00", "2021-09-24 22:00:00"],
"Vorhersage": [13.82, 14.83],
"Referenz": [16.6, 16.2],
"DWD_Name": ["Elpersbüttel", "Elpersbüttel"],
"Export": [17.2, 16.71],
"color": ["rgb(0,128,0)", "rgb(0,128,0)"],
"Status": ["ok", "ok"],
"min": [13.05, 12.81],
"max": [17, 18]
}
}
]
}

如果simplifyVector=F,则会产生嵌套数组。

{
"hourly": [
{
"Temperatur": {
"Datum": [
["2021-09-24 21:00:00"],
["2021-09-24 22:00:00"]
],
"Vorhersage": [
[14.82],
[14.83]
],
"Referenz": [
[16.6],
[16.2]
],
"DWD_Name": [
["Elpersbüttel"],
["Elpersbüttel"]
],
"Export": [
[17.2],
[16.71]
],
"color": [
["rgb(0,128,0)"],
["rgb(0,128,0)"]
],
"Status": [
["ok"],
["ok"]
],
"min": [
[13.05],
[12.81]
],
"max": [
[17],
[17]
]
}
},
{
"Temperatur2": {
"Datum": [
["2021-09-24 21:00:00"],
["2021-09-24 22:00:00"]
],
"Vorhersage": [
[13.82],
[14.83]
],
"Referenz": [
[16.6],
[16.2]
],
"DWD_Name": [
["Elpersbüttel"],
["Elpersbüttel"]
],
"Export": [
[17.2],
[16.71]
],
"color": [
["rgb(0,128,0)"],
["rgb(0,128,0)"]
],
"Status": [
["ok"],
["ok"]
],
"min": [
[13.05],
[12.81]
],
"max": [
[17],
[18]
]
}
}
]
}

在这两种情况下,底层问题都是fromJSON生成了一个列表对象,它不能正确地表示输入的数据结构。。。或者write_json(tojson(以错误的方式解释它。解决方法可以是使用simplifyVector=F,然后重新加载并修复数组。。

选项simplifyDataFrame = F解决了这个问题。

最新更新