【问题标题】:Output JSON array without the class name in every array element在每个数组元素中输出没有类名的 JSON 数组
【发布时间】:2026-01-18 08:25:01
【问题描述】:

在 Rails 中输出 JSON 的默认方式是这样的:
代码:
render :json => friends.to_json(:only => [:username, :avatar_file_name, :id ])

输出

{“朋友们” : [{“用户”: {“avatar_file_name”:“image1.jpg”,“用户名”:“user1”,“id”:1}}, {“用户”: {“avatar_file_name”:“image2.jpg”,“用户名”:“user2”,“id”:2}}, {“用户”: {“avatar_file_name”:“image3.jpg”,“用户名”:“user3”,“id”:3}} ]}

但我想要类似的东西:

{“朋友们” : {“用户”:[ {“avatar_file_name”:“image1.jpg”,“用户名”:“user1”,“id”:1}, {“avatar_file_name”:“image2.jpg”,“用户名”:“user2”,“id”:2}, {“avatar_file_name”:“image3.jpg”,“用户名”:“user3”,“id”:3} ]} }

类由数组名指定。
Last.fm 也使用这种语法见Last.fm 'API-user.getfriends'

【问题讨论】:

标签: ruby-on-rails ruby arrays json


【解决方案1】:

解决这个问题的方法是注释行
ActiveRecord::Base.include_root_in_json = true
initializers/new_rails_defaults.rb

或者将ActiveRecord::Base.include_root_in_json设置为false。

【讨论】:

  • 没有解决方案来满足一个功能吗?因为这会破坏应用程序中已经存在的其他 JSON 调用
  • 当然,只需将 root: nil 添加到控制器中的渲染调用
【解决方案2】:

您可以使用 javascript 重新格式化它:

var json = 
{
  "friends" : 
  { "user": [] }
}

var i = 0;
for ( x in friends )
{
     json.friends.user[i].avatar_file_name = x.user.avatar_file_name; // add more fields.
     i++;
}

其中的一些东西。

【讨论】:

  • 输出将在 iphone 应用程序中使用。所以输出不会通过javascript解析,而是直接转换为objective-C对象。我想要直接从 rails 获得正确的 json 文件。谢谢你的回答。
【解决方案3】:

JSON 通常用于以文本格式表示对象。

所以如果你喜欢第二个输出,你必须改变你的对象。

第一个输出说: 有一个 friends 对象,它是一个 user 数组,每个用户都有一些属性,您选择在其中公开 username, avatar_file_name, id

第二个输出说: 有一个 friends 对象,其中包含一个 user 对象,该对象是一组未命名对象,每个未命名对象都有一些属性...

第二个输出不能用 JSON 语法写。

可能是:

{"friends" : 
    {"user": [
      ["avatar_file_name", "username", "id"],
      ["image1.jpg", "user1", 1],
      ["image2.jpg", "user2", 2],
      ["image3.jpg", "user3", 3]
    ]}
}

这说: 有一个 friends 对象,其中包含一个 user 对象,该对象是一个数组数组(第一行具有字段名称的表)...

【讨论】:

  • Last.fm 也使用与我的第二个输出相同的语法。请参阅已编辑的问题。