【问题标题】:Custom formatting for JSON from a Rails controller来自 Rails 控制器的 JSON 自定义格式
【发布时间】:2013-05-03 21:14:22
【问题描述】:

我有两个导轨型号:

里程碑有许多任务 一个任务属于一个里程碑

在我的控制器中,我调用以下内容:

@milestones = Milestone.all
render :json => @milestones.to_json(:include => :tasks)

这给了我:

[   {
    "id": 5,
    "name": "This is milestone #1",
    "tasks": [{
            "complete": false,
            "id": 60,
            "name": "aaaaa",
            "milestone_id": 5,
        }, {
            "complete": false,
            "id": 62,
            "name": "ccccc",
            "milestone_id": 5,
        }
    ]
}, {
    "id": 6,
    "name": "This is milestone #2",
    "tasks": [{
            "complete": false,
            "id": 65,
            "name": "ffffff",
            "milestone_id": 5,
        }, {
            "complete": false,
            "id": 66,
            "name": "gggggg",
            "milestone_id": 5,
        }
    ]
}

]

但我需要能够轻松浏览 JSON,所以我希望能够像这样格式化它(注意每个“子数组”都标有“milestone_ID”或“task_ID”):

[   
"milestone_5": {
    "id": 5,
    "name": "This is milestone #1",
    "tasks": [
        "task_60":{
            "complete": false,
            "id": 60,
            "name": "aaaaa",
            "milestone_id": 5,
        }, 
        "task_62":{
            "complete": false,
            "id": 62,
            "name": "ccccc",
            "milestone_id": 5,
        }
    ]
}, 

"milestone_6":{
    "id": 6,
    "name": "This is milestone #2",
    "tasks": [
        "task_65":{
            "complete": false,
            "id": 65,
            "name": "ffffff",
            "milestone_id": 5,
        }, 
        "task_66":{
            "complete": false,
            "id": 66,
            "name": "gggggg",
            "milestone_id": 5,
        }
    ]
}

]

有没有人知道如何让 Rails 自定义格式 JSON。即使我必须丢失“里程碑_”部分而只是吐出 ID,那也会很有帮助。

谢谢!

【问题讨论】:

  • 是否有特定原因需要将其设为“milestone_6”而不是一系列里程碑?您的输出似乎违背了 json 的许多目的。为什么每个键都需要在值集中包含id
  • 在键中包含 id 将使我能够更轻松地浏览嵌套的 json。我必须做很多替换/更新,因为我使用的是前端 MVC。

标签: javascript ruby-on-rails json api


【解决方案1】:

看看json_builder gem。

您的要求当然是可行的,但就个人而言,当您开始使用控制器的 json 输出做任何远程有用的事情时,默认的 to_json 方法变得笨拙。最好明确输出您希望 json 的样子。

特别是在您的 json_builder 文件中...

milestone.json.json_builder

@milestones.each do |milestone|
  key "milestone_#{milestone.id}" do
    id milestone.id
    name milestone.name
  end
end

等等等等。我相信这样就可以了。

编辑:我倾向于只包含模型中我需要的任何资源消耗我的 json 的确切字段。这将提高性能,并且可以在出现问题时使调试变得更容易。哪些字段将显示在哪里也很明显。

【讨论】:

  • 正是我想要的!是的,我计划只包含我需要的少数字段,因为 JSON 可能会变得非常长、非常快。
猜你喜欢
  • 2014-05-20
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
相关资源
最近更新 更多