【问题标题】:Ruby/Rails - interate over complex (nested) JSON elements to create objectsRuby/Rails - 遍历复杂(嵌套)JSON 元素以创建对象
【发布时间】:2016-03-30 11:52:33
【问题描述】:

我正在从混合内容源解析一些 JSON,并尝试使用 ActiveRecord 存储它。

目前我正在使用大量变量:

json['settings']['newsletters']['weekly']
json['info']['address']['city']

或者尝试让事情变得更简单:

newsletters = json['settings']['newsletters']
newsletters['weekly']
address = json['info']['address']
address['city']

但这一切都变得非常混乱,而不是干燥。

我认为更好的方法是遍历每个作为哈希的元素(因此是“复杂的”),并将其分配给它自己的对象。这样,我不必声明一万亿个变量,而是可以从 JSON 输入的上下文中分配它们。

所以,我可以这样做:

user = json['input']
user.settings.newsletters.weekly
user.info.address.city

这是受到 ActiveResource 文档的启发:

# Any complex element (one that contains other elements) becomes its own object:
#
# {"id":1,"first":"Tyler","address":{"street":"Paper St.","state":"CA"}}
tyler = Person.find(1)
tyler.address  # => <Person::Address::xxxxx>
tyler.address.street  # => 'Paper St.'

这里是 JSON,为简洁起见被简化:

{
    "username": "robert_fitzsimmonds",
    "emails": [{
        "id_number": 1,
        "address": "robert_fitzsimmonds@yahoo.com",
        "confirmed": false
    }, {
        "id_number": 2,
        "address": "robert_fitzsimmonds@gmail.com",
        "confirmed": true
    }],
    "settings": {
        "marketing": {
            "main": true,
            "weekly": false,
            "daily": false
        },
        "language": "English"
    },
    "info": {
        "address": {
            "line_1": "31 Mole Road",
            "line_2": "",
            "city": "London",
            "post_code": "NE4 5RJ"
        },
        "shared_account": false
    }
}

这样的迭代会是最有效的解决方案,还是最好坚持冗长、混乱的变量?

【问题讨论】:

    标签: ruby-on-rails ruby json activerecord


    【解决方案1】:

    如果可以,请使用 hash_dot gem https://github.com/adsteel/hash_dot

    【讨论】:

    • 这正是我想要的!搜索 RDocs 和 GitHub 两天,不知何故我没有偶然发现这个 Gem。非常感谢萨娜。
    猜你喜欢
    • 2017-10-16
    • 2019-09-22
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多