2016-07-10 4 views
1

Я пытаюсь кодировать R-списки в json, используя пакет jsonlite и функцию toJSON. У меня есть простой элемент, как:Как я могу кодировать вектор R длины 1 как одно значение в json, используя пакет jsonlite R?

list(op='abc') 

Я хотел бы, чтобы стать:

{ 
    "op" : "abc" 
} 

Вместо этого, я получаю:

{ 
    "op" : ["abc"] 
} 

API-интерфейс, к которому я пытаюсь кормить этот json задыхается от последнего и требует первого. Любые предложения о том, как получить прежнее поведение от jsonlite (или другого пакета R json)?

+1

Попробуйте 'rjson' пакет. Это дает первое. – Psidom

+0

Это работает. Любые предложения о том, как получить это поведение из пакета jsonlite, который, как представляется, имеет лучшую производительность? – seandavi

+1

Я думаю, это зависит от ваших данных. Похоже, что если ваши исходные данные являются фреймом данных, он также даст первое. Могут ли ваши данные быть правильно преобразованы в кадр данных? – Psidom

ответ

2

auto_unbox аргумент делает трюк с jsonlite пакета:

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

урожайности:

{"op":"abc"} 

Update: на основе комментариев, этот подход, вероятно, безопаснее, и пример того, почему:

> 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