如何使用jsonlite R包将长度为1的R向量编码为单个JSON值?

8

我想使用jsonlite包和toJSON函数将R列表编码为json。 我有一个简单的项目,如下:

list(op='abc')

I'd like that to become:

{
  "op" : "abc"
}

相反,我得到:
{
  "op" : ["abc"]
}

我正试图将这个json输入到API中,但是API无法处理后者,只能接受前者。有没有什么建议可以从jsonlite(或其他R json包)中获取前者的行为?


1
尝试使用 rjson 包。它会给出前者。 - Psidom
可以用jsonlite包来获得更好的性能,你有什么建议吗? - seandavi
1
我认为这取决于你的数据。如果你的原始数据是一个数据框架,它似乎也会给出前者。你的数据能否被正确地转换为数据框架? - Psidom
不幸的是,rjson在保存带有变音字符的JSON文件时会出现问题。 - Karol Daniluk
1个回答

8
auto_unbox参数是使用jsonlite包的技巧:
toJSON(list(op='abc'),auto_unbox=TRUE)

产生:

{"op":"abc"}

更新:根据评论,这种方法可能更安全,并且以下是一个例子:

> 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

2
通常情况下,避免这种情况更安全,而是使用unbox()函数来取消包装单个元素。一个例外是AsIs类的对象(即包装在I()中的对象)不会自动取消包装。这是将单个值标记为长度为1的数组的一种方法。 - hrbrmstr
如果我的列表是R对象,并且我想要解包的这些元素在列表中有4个层级深度,该怎么办? - Karol Daniluk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接