当前位置: 首页 > 面试题库 >

如何将JSON转换为哈希,搜索和更改值

邹宏峻
2023-03-14
问题内容

我正在尝试处理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",
      "member": true,
      "current": false,
      "sponsor": "judy",
      "profile": "",
      "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, key, 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, val)
    keys = key.strip(".")
    hash[*keys] = locate_arr(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, "persons.name=mary.activities", "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
  },
  "values": {
    "lo-value": 34,
    "hi-value": 554
  },
  "persons": [
    {
      "name": "john",
      "member": true,
      "current": false,
      "sponsor": "pete",
      "credits": ["04"],
      "linked": ["philip","guy"],
      "maptools": ["crossfit","soccer","running"]
    },
    {
      "name": "mary",
      "member": true,
      "current": false,
      "sponsor": "judy",
      "profile": "",
      "activities": ["swimming", "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\",\"member\":true,\"current\":false,\"sponsor\":\"judy\",\"profile\":\"\",\"credits\":[\"all\"],\"activities\":[\"swimming\",\"cycling\",\"running\"]}],\"data_map\":[1122,3234]}"

我建议使用OpenStruct来组织数据:

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

然后,您得到了所有想要的东西。对于您显示的操作:

#change_key(hash, "features.additional-options", 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, "persons.name=mary.activities", "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, "persons.name=mary.activities", "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处理 结构变化的
数据非常好。如果您具有可以“建模”的数据,可以调用的名称,可以预测的某些属性,甚至可以用于此数据的方法,那么建议您创建一个Class来描述此数据,其属性和属性(甚至可以继承自OpenStruct)。然后在这个Class域内工作,创建一个抽象层。这样,您的代码将变得更加健壮和易读。不要忘记创建自动测试!它为您节省了大量时间。

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

有关更多信息,请参见:Object和ActiveData。



 类似资料:
  • 问题内容: 我有一个持有以下值的JSON对象: 我想在Ruby中循环遍历以获得键/值对。当我使用时,它不会遍历对象,因为它不是Ruby哈希形式: 如何将上述JSON对象转换为Ruby哈希? 问题答案: 接下来的代码片段呢?

  • 问题内容: 如何将ruby哈希对象转换为JSON?所以我在下面尝试这个例子,它不起作用? 我当时在看RubyDoc,显然对象没有方法。但是我正在阅读Rails支持并且也支持的博客。我可以理解是一个Rails对象,但不是Rails本身,它是一个纯Ruby对象。因此,在Rails中可以执行,但不能在纯Ruby中执行? 问题答案: Ruby的众多优点之一就是可以使用自己的方法扩展现有的类。这称为“类重新

  • 我想重定向到另一个页面 这工作正常,但它首先会变为 我也试着跟随 它正在创建一个正确的URL,但没有向下滚动到id为某个DIV id的 编辑 另外我尝试了

  • 我刚刚开始学习哈希表,我知道如何插入,但不知道如何搜索。以下是我将基于这个问题的算法: 散列密钥 线性探测碰撞分辨率。 假设我用键1、11和21调用两次插入。这将返回所有3个键的槽1。冲突解决后,表在槽1、2和3处将有值1、11和21。这就是我对插入的理解。 完成此操作后,如果搜索键11和21,我将如何获得插槽2和3?从我所读到的内容来看,搜索哈希表应该做与插入完全相同的事情,除非当你到达所需的插

  • 问题内容: 如何在Java中将hashmap转换或转换为JSON对象,然后再次将JSON对象转换为JSON字符串? 问题答案: 您可以使用: 注意: 这仅适用于 您可以从其文档中获得其他功能 http://stleary.github.io/JSON-java/index.html

  • 我有 2 个数组: 我希望array1元素成为新Hash中的键,array2元素成为同一个Hash中相应的值。有人能建议一下怎么做吗? 谢谢