Json格式化方形括号

时间:2015-06-05 10:25:09

标签: ruby-on-rails ruby json format

我尝试渲染json,其中根目录用方括号括起来。我要求的格式是:

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

我的代码是:

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

我无法在响应中获得方括号。我目前的回应是:

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

如何获得所需的格式?

2 个答案:

答案 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数据有点过分。