Reputation: 10441
I am struggling mightily with what I feel should be a simple problem, and it is becoming frustrating. I have a list object in R, where some of the list items are JSON objects. In particular, I have the following variable:
> dput(node)
structure(list(teamname = "", round = 5, id = 31, seeding = NA_real_,
wins = 0, losses = 0, completed = FALSE, r1odds = structure("{\"Rockets\":0.2,\"Timberwolves\":0.01,\"Jazz\":0.04,\"Thunder\":0.03,\"Warriors\":0.25,\"Spurs\":0.02,\"Trail Blazers\":0.07,\"Pelicans\":0.02,\"Raptors\":0.05,\"Wizards\":0.01,\"Cavaliers\":0.12,\"Pacers\":0.04,\"Celtics\":0.04,\"Bucks\":0.02,\"76ers\":0.06,\"Heat\":0.02}", class = "json"),
r2odds = structure("{\"Rockets\":0.25,\"Jazz\":0.05,\"Warriors\":0.35,\"Pelicans\":0.07,\"Raptors\":0.06,\"Cavaliers\":0.11,\"Celtics\":0.05,\"76ers\":0.06}", class = "json"),
r3odds = structure("{\"Rockets\":0.35,\"Warriors\":0.41,\"Cavaliers\":0.15,\"Celtics\":0.09}", class = "json")), .Names = c("teamname",
"round", "id", "seeding", "wins", "losses", "completed", "r1odds",
"r2odds", "r3odds"))
> node
$teamname
[1] ""
$round
[1] 5
$id
[1] 31
$seeding
[1] NA
$wins
[1] 0
$losses
[1] 0
$completed
[1] FALSE
$r1odds
{"Rockets":0.2,"Timberwolves":0.01,"Jazz":0.04,"Thunder":0.03,"Warriors":0.25,"Spurs":0.02,"Trail Blazers":0.07,"Pelicans":0.02,"Raptors":0.05,"Wizards":0.01,"Cavaliers":0.12,"Pacers":0.04,"Celtics":0.04,"Bucks":0.02,"76ers":0.06,"Heat":0.02}
$r2odds
{"Rockets":0.25,"Jazz":0.05,"Warriors":0.35,"Pelicans":0.07,"Raptors":0.06,"Cavaliers":0.11,"Celtics":0.05,"76ers":0.06}
$r3odds
{"Rockets":0.35,"Warriors":0.41,"Cavaliers":0.15,"Celtics":0.09}
> class(node$r2odds)
[1] "json"
note that elements $r3odds, $r2odds, etc. are of class JSON here. However, when I run the following:
jsonlite::toJSON(node, pretty = TRUE, auto_unbox = TRUE)
For some reason it is wrapping each of the object values in quotes:
{
"teamname": "",
"round": 5,
"id": 31,
"seeding": "NA",
"wins": 0,
"losses": 0,
"completed": false,
"r1odds": "{\"Rockets\":0.2,\"Timberwolves\":0.01,\"Jazz\":0.04,\"Thunder\":0.03,\"Warriors\":0.25,\"Spurs\":0.02,\"Trail Blazers\":0.07,\"Pelicans\":0.02,\"Raptors\":0.05,\"Wizards\":0.01,\"Cavaliers\":0.12,\"Pacers\":0.04,\"Celtics\":0.04,\"Bucks\":0.02,\"76ers\":0.06,\"Heat\":0.02}",
"r2odds": "{\"Rockets\":0.25,\"Jazz\":0.05,\"Warriors\":0.35,\"Pelicans\":0.07,\"Raptors\":0.06,\"Cavaliers\":0.11,\"Celtics\":0.05,\"76ers\":0.06}",
"r3odds": "{\"Rockets\":0.35,\"Warriors\":0.41,\"Cavaliers\":0.15,\"Celtics\":0.09}"
}
whereas I would like the object returned to look like this:
{
"teamname": "",
"round": 5,
"id": 31,
"seeding": "NA",
"wins": 0,
"losses": 0,
"completed": false,
"r1odds":{\"Rockets\":0.2,\"Timberwolves\":0.01,\"Jazz\":0.04,\"Thunder\":0.03,\"Warriors\":0.25,\"Spurs\":0.02,\"Trail Blazers\":0.07,\"Pelicans\":0.02,\"Raptors\":0.05,\"Wizards\":0.01,\"Cavaliers\":0.12,\"Pacers\":0.04,\"Celtics\":0.04,\"Bucks\":0.02,\"76ers\":0.06,\"Heat\":0.02},
"r2odds":{\"Rockets\":0.25,\"Jazz\":0.05,\"Warriors\":0.35,\"Pelicans\":0.07,\"Raptors\":0.06,\"Cavaliers\":0.11,\"Celtics\":0.05,\"76ers\":0.06},
"r3odds":{\"Rockets\":0.35,\"Warriors\":0.41,\"Cavaliers\":0.15,\"Celtics\":0.09}
}
and preferably not have all of the escape characters as well around the object keys. is this possible?
thanks!
Upvotes: 1
Views: 355
Reputation: 47330
You have some list containing JSON
items and non JSON
items, toJSON
doesn't like that. First we go back to a standard list structure, then we use toJSON
:
library(jsonlite)
library(purrr)
node %>%
modify_at(8:10,fromJSON) %>%
toJSON(pretty=TRUE, auto_unbox = TRUE)
# {
# "teamname": "",
# "round": 5,
# "id": 31,
# "seeding": "NA",
# "wins": 0,
# "losses": 0,
# "completed": false,
# "r1odds": {
# "Rockets": 0.2,
# "Timberwolves": 0.01,
# "Jazz": 0.04,
# "Thunder": 0.03,
# "Warriors": 0.25,
# "Spurs": 0.02,
# "Trail Blazers": 0.07,
# "Pelicans": 0.02,
# "Raptors": 0.05,
# "Wizards": 0.01,
# "Cavaliers": 0.12,
# "Pacers": 0.04,
# "Celtics": 0.04,
# "Bucks": 0.02,
# "76ers": 0.06,
# "Heat": 0.02
# },
# "r2odds": {
# "Rockets": 0.25,
# "Jazz": 0.05,
# "Warriors": 0.35,
# "Pelicans": 0.07,
# "Raptors": 0.06,
# "Cavaliers": 0.11,
# "Celtics": 0.05,
# "76ers": 0.06
# },
# "r3odds": {
# "Rockets": 0.35,
# "Warriors": 0.41,
# "Cavaliers": 0.15,
# "Celtics": 0.09
# }
# }
Upvotes: 2