How can I encode an R vector of length 1 as a single value in json using the jsonlite R package?
Asked Answered
S

1

8

I am trying to encode R lists into json using the jsonlite package and the toJSON function. I have a simple item like:

list(op='abc')

I'd like that to become:

{
  "op" : "abc"
}

Instead, I get:

{
  "op" : ["abc"]
}

The API to which I am trying to feed this json chokes on the latter and requires the former. Any suggestions on how to get the former behavior from jsonlite (or another R json package)?

Stereochemistry answered 10/7, 2016 at 2:54 Comment(4)
Try rjson package. It is giving the former.Isocline
That works. Any suggestions on how to get that behavior from the jsonlite package, which seems to have better performance?Stereochemistry
I think it depends on your data. It seems that if your original data is a data frame, it will also gives the former. Can your data be converted to a data frame properly?Isocline
Unfortunatelly rjson has problems when saving to JSON file with diacritic characters.Scrubby
S
8

The auto_unbox argument does the trick with the jsonlite package:

toJSON(list(op='abc'),auto_unbox=TRUE)

yields:

{"op":"abc"}

Update: based on comment, this approach is probably safer, and an example of why:

> jsonlite::toJSON(list(x=unbox(1),y=c(1,2)))
{"x":1,"y":[1,2]} 
> jsonlite::toJSON(list(x=unbox(1),y=unbox(c(1,2)))) # expect error here.
Error: Tried to unbox a vector of length 2
Stereochemistry answered 10/7, 2016 at 3:15 Comment(2)
"It is usually safer to avoid this and instead use the unbox() function to unbox individual elements. An exception is that objects of class AsIs (i.e. wrapped in I()) are not automatically unboxed. This is a way to mark single values as length-1 arrays."Dampproof
What if my list is R object, and these elements I want to unbox are 4 levels deep in the list?Scrubby

© 2022 - 2024 — McMap. All rights reserved.