繁体   English   中英

Ruby / Rails-遍历复杂(嵌套)的JSON元素以创建对象

[英]Ruby/Rails - interate over complex (nested) JSON elements to create objects

我正在从混合内容源中解析一些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
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM