我正在尝试找到一种在ruby中对JSON数据进行排序的方法。它被存储为一个相当复杂(我认为无论如何)的哈希,看起来像这样:
{
"allergies": {
"allergy": [
{
"id": "11426793",
"name": "Milk",
"category": "Food Allergy",
"createdPerson": "AGUDELO-HERNANDEZ ARCADIO",
"onsetDate": "2014-05-05T00:29:28-04:00"
}, {
"id": "11426788",
"name": "Antibiotics",
"category": "Drug Allergy",
"createdPerson": "Smith John H",
"onsetDate": "2014-05-04T22:29:28-04:00"
}
]
},
"responseErrors": {
"responseError": []
}
}
实际数据中存在更多“过敏”对象,我希望能够通过“startingDate”然后按“name”对它们进行排序。我试过了:
sorted = @allergies["allergies"].sort_by { |hsh| hsh["name"] }
但是我收到以下错误:
no implicit conversion of String into Integer (TypeError)
答案 0 :(得分:1)
你快到了那里:
require "json"
str = <<EOS
{
"allergies": {
"allergy": [
{
"id": "11426793",
"name": "Milk",
"category": "Food Allergy",
"createdPerson": "AGUDELO-HERNANDEZ ARCADIO",
"onsetDate": "2014-05-05T00:29:28-04:00"
},
{
"id": "11426788",
"name": "Antibiotics",
"category": "Drug Allergy",
"createdPerson": "Smith John H",
"onsetDate": "2014-05-04T22:29:28-04:00"
}
]
},
"responseErrors": {
"responseError": []
}
}
EOS
@allergies = JSON.parse(str)
puts @allergies["allergies"]["allergy"].sort_by { |hsh| hsh["name"] }
你有JSON(不是哈希),所以你首先必须将它从JSON解析为哈希。此外,您尝试排序的数组深度为2级。
答案 1 :(得分:0)
@allergies["allergies"]
返回一个哈希,即:
{
"allergy": [
{
"id": "11426793",
"name": "Milk",
"category": "Food Allergy",
"createdPerson": "AGUDELO-HERNANDEZ ARCADIO",
"onsetDate": "2014-05-05T00:29:28-04:00"
}, {
"id": "11426788",
"name": "Antibiotics",
"category": "Drug Allergy",
"createdPerson": "Smith John H",
"onsetDate": "2014-05-04T22:29:28-04:00"
}
]
}
在散列上调用sort_by
,它将为块生成每个键值对。所以在
@allergies["allergies"].sort_by { |hsh| hsh["name"] }
hsh
是一个数组。 Array#[]
期望Integer作为其参数。它会尝试将"name"
转换为Integer,并因您看到的错误而失败。
你需要
@allergies["allergies"]["allergy"].sort_by { |hsh| hsh["name"] }
或者,如果您要对值进行排序,以便原始数据已排序allergy
,请使用sort_by!