加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何将JSON转换为哈希值,搜索并更改值

发布时间:2020-12-16 20:52:07 所属栏目:百科 来源:网络整理
导读:我正在尝试处理JSON文件: { "features": { "additional-options": true },"values": { "lo-value": 34,"hi-value": 554 },"persons": [ { "name": "john","member": true,"current": false,"sponsor": "pete","profile": "","credits": ["04"],"linked": ["
我正在尝试处理JSON文件:
{
  "features": {
    "additional-options": true
  },"values": {
    "lo-value": 34,"hi-value": 554
  },"persons": [
    {
      "name": "john","member": true,"current": false,"sponsor": "pete","profile": "","credits": ["04"],"linked": ["philip","guy"],"maptools": ["crossfit","soccer","running"]
    },{
      "name": "mary","sponsor": "judy","credits": ["all"],"activities": ["swimming","cycling","running"]
    }
  ],"data_map": [1122,3234]
}

我希望能够:

>更新键值对的值
>删除键/值
>删除或插入一个数组值

我已经尝试了很多这样的事情来做到这一点.

我的简化代码理念是:

require 'json'

hash = JSON.parse(File.read('test.json'))

# Add key & value or change existing one
def change_key(hash,key,value)
    keys = key.strip(".")
    hash[*keys] = value
end

def add_to_array(hash,val)
    keys = key.strip(".")
    hash[*keys] = locate_arr(hash,key).insert(val)
end

# Delete a key and it's value
def del_key(hash,key)
    keys = key.strip(".")
    hash[*keys].delete[-1]
end

def del_from_array(hash,key).delete[-1]
end

f = File.write('test.json') ; f.puts JSON.pretty_generate(hash)


change_key(hash,"features.additional-options",false)

del_from_array(hash,"persons.name=mary.activities","cycling")

add_to_array(hash,"hockey")

del_key(hash,"data_map")

del_key(hash,persons.name=john.profile)

del_key(hash,persons.name=mary.credits)

生成的JSON应该是:

{
  "features": {
    "additional-options": false
  },"running","hockey"]
    }
  ]
}

我不确定如何使用结构如下的JSON.

解决方法

我知道您的JSON可能如下所示:
"{"features":{"additional-options":true},"values":{"lo-value":34,"hi-value":554},"persons":[{"name":"john","member":true,"current":false,"sponsor":"pete","profile":"","credits":["04"],"linked":["philip","guy"],"maptools":["crossfit","soccer","running"]},{"name":"mary","sponsor":"judy","credits":["all"],"activities":["swimming","cycling","running"]}],"data_map":[1122,3234]}"

我建议使用OpenStruct来整理您的数据:

your_struct_name =  JSON.parse(yourJson,object_class: OpenStruct)

然后你得到你想要的所有东西.对于您显示的操作:

#change_key(hash,false)
your_struct_name.features['additional-options'] = false 
#this one above you set in this hash-like manner because of the '-' in the middle of the key. Otherwise you could just do your_struct_name.features.additional_options = false

#del_from_array(hash,"cycling")
your_struct_name.persons.last.activities.delete('swimming')

# or selecting by name:
your_struct_name.persons.select {|person| person.name == 'mary' }.first.activities.delete('swimming')

#add_to_array(hash,"hockey")
your_struct_name.persons.last.activities << 'hockey'

#del_key(hash,"data_map")
your_struct_name.delete_field('data_map')

#del_key(hash,persons.name=john.profile)
...

#del_key(hash,persons.name=mary.credits)
...

然后,在进行更改后,您可以使用:

your_struct_name.to_h.to_json

您还可以使用方法as_json来获得与您在问题上显示的结构非常相似的结构:

your_struct_name.as_json

OpenStruct非常适合处理具有不断变化的结构的数据.如果您有可以“建模”的数据,有一个可以调用的名称,有一些您可以预测的属性,甚至是您将用于此数据的方法,我建议您创建一个类来描述这些数据,它的属性和属性(它甚至可以从OpenStruct继承).然后在这个类域内工作,创建一个抽象层.这样,您的代码就变得更加健壮和可读.不要忘记创建自动测试!它可以为您节省大量时间.

组织和抽象数据的方式,特别是命名实体的方式,对代码质量有很大影响.

如需进一步阅读,请参阅:Object和ActiveData.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读