我尝试渲染json,其中根目录用方括号括起来。我要求的格式是:
[{"status":"Failure","message":"Invalid Credentials"}]
我的代码是:
render :json=> [{:status=>'Failure',:message=>'Invalid Credentials'}], :status=>422
我无法在响应中获得方括号。我目前的回应是:
{"status":"Failure","message":"Invalid Credentials"}
如何获得所需的格式?
答案 0 :(得分: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]。这将返回您描述的对象。
答案 1 :(得分:0)
Rails json
渲染系统有很多不足之处。这是一个解决方法:
render(
text: [ {:status=>'Failure',:message=>'Invalid Credentials'} ].to_json,
content_type: 'application/json',
status: 422
)
如果您愿意自己进行编码,可以通过系统强制执行任何操作。 Rails不会触及text
渲染调用的内容,只是忠实地发送它。
值得注意的是,某些模块可能会改变render(json:...)
方法的行为,例如jBuilder。
如果经常这样做,您可能希望在控制器中创建一个正确封装它的方法,如:
def render_json(object, options = nil)
render({
text: object.to_json,
content_type: 'application.json'
}.merge(options || { }))
end
要做到这一点有点令人讨厌,但Rails确实对你想如何编码你的JSON数据有点过分。