用ruby修改json文件

问题描述 投票:4回答:2

我有一个json文件,我需要使用ruby脚本访问和修改。我知道如何打开一个json,如何编写一个新的,但我可以修改现有的吗?

我已经搜索了一下,但我还没有找到任何有用的东西..只有结果对待不同的编程语言..

例如:我想修改一个错误的数据,如下面的安娜的姓氏。

employee.json

{"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}

=>

{"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"David"},
    {"firstName":"Peter", "lastName":"Jones"}
]}

提前致谢,

ruby json
2个回答
6
投票

将json转换为hash,编辑hash,转换回json:

require 'json'

a = '{"employees":[
      {"firstName":"John", "lastName":"Doe"},
      {"firstName":"Anna", "lastName":"Smith"},
      {"firstName":"Peter", "lastName":"Jones"}
    ]}'

# Converting JSON to Hash
hash = JSON.parse a
# => {"employees"=>[{"firstName"=>"John", "lastName"=>"Doe"}, {"firstName"=>"Anna", "lastName"=>"Smith"}, {"firstName"=>"Peter", "lastName"=>"Jones"}]} 

# Modifying Hash as required
hash["employees"][1]["lastName"]  = "David"

# Modified Hash
hash
# => {"employees"=>[{"firstName"=>"John", "lastName"=>"Doe"}, {"firstName"=>"Anna", "lastName"=>"David"}, {"firstName"=>"Peter", "lastName"=>"Jones"}]}


# Converting Hash back to JSON
hash.to_json
#  "{\"employees\":[{\"firstName\":\"John\",\"lastName\":\"Doe\"}, {\"firstName\":\"Anna\",\"lastName\":\"David\"}, {\"firstName\":\"Peter\",\"lastName\":\"Jones\"}]}"

我已经直接修改了哈希,因为我可以看到确切的索引并且通过Hash迭代不是问题。但是在现实世界的例子中,您可能希望通过Hash查找密钥然后修改它,而不是像上面的示例那样直接进行修改。

您可以使用pretty_generate来打印您的json。这里:

hash
# => {"employees"=>[{"firstName"=>"John", "lastName"=>"Doe"}, {"firstName"=>"Anna", "lastName"=>"David"}, {"firstName"=>"Peter", "lastName"=>"Jones"}]}

puts JSON.pretty_generate hash
#{
#  "employees": [
#    {
#      "firstName": "John",
#      "lastName": "Doe"
#    },
#    {
#      "firstName": "Anna",
#      "lastName": "David"
#    },
#    {
#      "firstName": "Peter",
#      "lastName": "Jones"
#    }
#  ]
#}

0
投票

jsonpath gem可以开箱即用

JsonPath.for('{"candy":"lollipop"}').gsub('$..candy') {|v| "big turks" }.to_hash

在你的情况下像

require 'jsonpath'

a = '{"employees":[
      {"firstName":"John", "lastName":"Doe"},
      {"firstName":"Anna", "lastName":"Smith"},
      {"firstName":"Peter", "lastName":"Jones"}
    ]}'
JsonPath.for(a).gsub('$.employees[1].lastName') {|v| "David" }.to_hash

会做的

© www.soinside.com 2019 - 2024. All rights reserved.