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

sea*_*avi 5 json r jsonlite

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

list(op='abc')
Run Code Online (Sandbox Code Playgroud)

我希望成为:

{
  "op" : "abc"
}
Run Code Online (Sandbox Code Playgroud)

相反,我得到:

{
  "op" : ["abc"]
}
Run Code Online (Sandbox Code Playgroud)

我试图向其提供json的API扼流圈,并要求前者。关于如何从jsonlite(或另一个R json包)获取以前的行为的任何建议吗?

sea*_*avi 5

auto_unbox参数可以解决这个问题jsonlite

toJSON(list(op='abc'),auto_unbox=TRUE)
Run Code Online (Sandbox Code Playgroud)

产量:

{"op":"abc"}
Run Code Online (Sandbox Code Playgroud)

更新:根据评论,此方法可能更安全,并举例说明原因:

> 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
Run Code Online (Sandbox Code Playgroud)

  • _“通常最好避免这种情况,而是使用`unbox()`函数对单个元素进行拆箱。一个例外是,不会自动取消对AsIs类的对象(即包装在I()中的对象)进行拆箱。将单个值标记为长度为1的数组。“ _ (2认同)