Canovice
Canovice

Reputation: 10441

jsonlite toJSON adding excess quotes around an object

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

Answers (1)

moodymudskipper
moodymudskipper

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

Related Questions