这是访问 JSON 中各个元素的方法:
require 'json'
foo = JSON['{"data":[{"Chris":[{"long":10,"lat":19}]},{"Scott":[{"long":9,"lat":18}]}]}']
foo['data'][0]['Chris'][0]['long'] = 5
foo['data'][0]['Chris'][0]['lat'] = 7
foo # => {"data"=>[{"Chris"=>[{"long"=>5, "lat"=>7}]}, {"Scott"=>[{"long"=>9, "lat"=>18}]}]}
您可以通过使用变量作为对象的占位符来稍微简化路径:
foo = JSON['{"data":[{"Chris":[{"long":10,"lat":19}]},{"Scott":[{"long":9,"lat":18}]}]}']
chris = foo['data'][0]['Chris'][0]
chris['long'] = 5
chris['lat'] = 7
foo # => {"data"=>[{"Chris"=>[{"long"=>5, "lat"=>7}]}, {"Scott"=>[{"long"=>9, "lat"=>18}]}]}
chris
指向“Chris”哈希值,该哈希值嵌入在foo
哈希。更改为chris
哈希发生在里面foo
.
如果哈希值是正常定义的,它会更干净/清晰和直接:
foo = JSON['{"data":{"Chris":{"long":5,"lat":7},"Scott":{"long":9,"lat":18}}}']
foo['data']['Chris']['long'] = 5
foo['data']['Chris']['lat'] = 7
foo # => {"data"=>{"Chris"=>{"long"=>5, "lat"=>7}, "Scott"=>{"long"=>9, "lat"=>18}}}
foo
更明确地定义为:
foo = {
'data' => {
'Chris' => {'long' => 5, 'lat' => 7},
'Scott' => {'long' => 9, 'lat' => 18}
}
}
有条件地迭代哈希以查找特定的键/值对,哈希如下所示:
require 'json'
foo = JSON['{"data":[{"Chris":[{"long":10,"lat":19}]},{"Scott":[{"long":9,"lat":18}]}]}']
user_name = 'Chris'
data = foo['data'].first
data.first.each do |key, value|
if key == user_name
data[user_name].first['long'] = 5
data[user_name].first['lat'] = 6
end
end
foo # => {"data"=>[{"Chris"=>[{"long"=>5, "lat"=>6}]}, {"Scott"=>[{"long"=>9, "lat"=>18}]}]}
不得不使用first
(or [0]
)获取哈希元素有味道。
使用正确定义的哈希会产生如下所示的代码:
foo = JSON['{"data":{"Chris":{"long":10,"lat":19},"Scott":{"long":9,"lat":18}}}']
foo['data'].each do |key, value|
if key == user_name
value['long'] = 5
value['lat'] = 7
end
end
foo # => {"data"=>{"Chris"=>{"long"=>5, "lat"=>7}, "Scott"=>{"long"=>9, "lat"=>18}}}
如何添加另一个名为 Bob 且长 = 10 且纬度 = 20 的人
听起来您没有很好地掌握操作/访问哈希值,或者如何与 JSON 相互转换。你最好把这些基础知识记下来。
不要从 JSON 开始,而是从 Ruby 哈希开始:
require 'json'
foo = {
"data" => {
"Chris" => {
"long" => 5,
"lat" => 7
},
"Scott" => {
"long" => 9,
"lat" => 18
}
}
}
添加您想要的任何其他哈希元素:
bob_hash = {'Bob' => {'long' => 10, 'lat' => 20}}
foo['data'].merge!(bob_hash)
merge! http://www.ruby-doc.org/core-2.1.1/Hash.html#method-i-merge-21 adds bob_hash
to foo['data']
。然后,告诉哈希使用以下方式输出其 JSON 表示形式to_json
。使用熟悉的 Ruby 结构并让 Ruby 完成转换为 JSON 的繁重工作比尝试对现有 JSON 字符串进行字符串操作要容易得多。如果您有 JSON,则解析它并转换/修改生成的 Ruby 对象,然后再次输出 JSON。
puts foo.to_json
# >> {"data":{"Chris":{"long":5,"lat":7},"Scott":{"long":9,"lat":18},"Bob":{"long":10,"lat":20}}}
我建议阅读“如何将 JSON 转换为哈希、搜索和更改值 https://stackoverflow.com/questions/32228126/ruby-json-to-hash-search-change-value“另外,因为它是访问结果哈希中的值的有用替代方案。