Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中编辑JSON数组内容_Ruby_Arrays_Json_Hash - Fatal编程技术网

在Ruby中编辑JSON数组内容

在Ruby中编辑JSON数组内容,ruby,arrays,json,hash,Ruby,Arrays,Json,Hash,我的JSON数组的结构如下: {"data":[{"Chris":[{"long":10,"lat":19}]},{"Scott":[{"long":9,"lat":18}]}]} 在ruby程序中,我希望能够编辑名称的lat和long值。但我不太清楚如何做到这一点 sections.each do |user_coords| user_coords.each do |user, coords| if user == Usrname then

我的JSON数组的结构如下:

{"data":[{"Chris":[{"long":10,"lat":19}]},{"Scott":[{"long":9,"lat":18}]}]}
在ruby程序中,我希望能够编辑名称的lat和long值。但我不太清楚如何做到这一点

sections.each do |user_coords|
        user_coords.each do |user, coords|
            if user == Usrname then
                #Change lat and long value for Usrname
            end
        end
end

如何做到这一点?

这是如何访问JSON中的各个元素:

username = 'Chris'
sections.each do |user_coords|
  user_coords.each do |user, coords|
    if user == username then
      coords.each do |lat_long|
        lat_long['lat']  = 123 # Your value here...
        lat_long['long'] = 456 # Your value here...
      end
    end
  end
end
sections.to_json # => '[{"Chris":[{"long":456,"lat":123}]}...]'
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
指向嵌入
foo
散列中的“chris”散列。对
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}]}]}
必须先使用
(或
[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的人,其long=10,lat=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)
bob_hash
添加到
foo['data']
。然后,告诉散列使用
将其JSON表示输出到\u 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}}}

我还建议阅读“”,因为它是访问结果哈希中的值的有用替代方法。

为什么要注释掉最后一行的一部分?最后一行显示返回的值。这是许多开发人员使用的TextMate和Sublime文本编辑器中的一项功能,与您在IRB中看到的输出类似。@Cj1m:与其他人共享代码示例时,演示语句以及显示返回值的注释(
语句#=>返回值
)是一种常见做法。例如,在JavaScript中,您可能会说
[1,2,3].pop();//=>3
。然后,我想将节添加回“数据”数组中,我该怎么做?您真的需要了解哈希为何如此复杂。通常定义的散列将更容易导航/修改。照目前的情况,您正在处理一些您很少看到的内容,因此您学习如何处理此内容将不适用于普通哈希。我现在把JSON脚本改成:{“data”:{“Chris”:{“long”:10,“lat”:10},“Scott”:{“long”:9,“lat”:18}}}}如何添加另一个名为Bob的人,long=10,lat=20你真的需要阅读一些Ruby教程。这是基本的散列用法101。