如何在Ruby中包含数组的JSON数据(哈希)

时间:2014-05-08 01:33:13

标签: ruby json

我正在尝试找到一种在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)

2 个答案:

答案 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!