Json 用方括号格式化

Json Formatted with Square Brackets

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

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

我的代码是:

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

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

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

如何获取所需的格式?

您要做的是在 return 中命名您希望接收的整个对象。方括号表示一个数组,但是 JSON 总是 return 是一个 HASH(花括号)...诀窍是这个散列可能包含一个数组。所以代替:

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

这样做:

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

然后,获取 my_json[:my_array] 而不是获取 json 对象(我们将其称为 my_json]。这将 return 您描述的对象。

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 数据做出了过多的假设。