2015-06-05 4 views
-2

Я попытался отобразить json, где корневой каталог заключен в квадратные скобки. Мой требуется Формат:Json Отформатирован с квадратными скобками

[{"status":"Failure","message":"Invalid Credentials"}] 

Мой код:

render :json=> [{:status=>'Failure',:message=>'Invalid Credentials'}], :status=>422 

Я не могу получить квадратные скобки в ответ. Мой текущий ответ:

{"status":"Failure","message":"Invalid Credentials"} 

Как я могу получить требуемый формат?

+1

очевидно, что вы не можете сделать это, как хотите. Ответ json всегда находится в '{}'. вы можете попробовать по-другому, как '{: op => [{« status »:« Failure »,« message »:« Invalid Credentials »}]}'. –

+4

Что такое _square_ root? –

+0

Rails отправляет его правильно. Я думаю, что проблема находится на стороне приема ответа? –

ответ

0

Что вы хотите сделать, это назвать весь объект, который вы хотите получить взамен. Квадратные скобки указывают массив, но JSON всегда возвращает HASH (фигурные скобки) ... трюк в том, что этот хэш может СОДЕРЖАТЬ массив. Таким образом, вместо:

render :json=> [{:status=>'Failure',:message=>'Invalid Credentials'}], :status=>422 

ли это:

render :json=> { :my_array => [{:status=>'Failure',:message=>'Invalid Credentials'}], :status=>422 } 

Затем, вместо того, чтобы объект JSON (который мы будем называть просто my_json), получить my_json [: my_array]. Это вернет объект, который вы описывали.

+0

'[]' является допустимым документом JSON. – tadman

+0

Да, так же, как оператор открытия OP действителен JSON, но он возвращает содержимое этих фигурных скобок, если я не ошибаюсь, так что вы только что сказали, будет равно nil (а не '[nil]').Я должен проверить, что я не схожу с ума, но я считаю, что все в моем ответе остается верным. – ConnorCMcKee

+0

Моя жалоба заключается в том, что ваш ответ вводит уровень нежелательной информации, что крайне нежелательно. – tadman

0

Система рельсов json оставляет желать лучшего. Вот работа:

render(
    text: [ {:status=>'Failure',:message=>'Invalid Credentials'} ].to_json, 
    content_type: 'application/json', 
    status: 422 
) 

Вы можете заставить все, что хотите, через систему, если вы хотите сделать кодировку самостоятельно. Рельсы не будут касаться содержимого вызова визуализации text, он просто отправляет это через достоверно.

Следует отметить, что некоторые модули могут изменять поведение метода render(json:...), например jBuilder.

Если вы делаете это часто, вы можете захотеть сделать метод в контроллере, который инкапсулирует это правильно, как:

def render_json(object, options = nil) 
    render({ 
    text: object.to_json, 
    content_type: 'application.json' 
    }.merge(options || { })) 
end 

Это немного противный, чтобы сделать это, но Rails действительно полагаю, немного слишком много о том, как вы хотите кодировать данные JSON.

Смежные вопросы