我有一个庞大的第三方 JSON 提要 - 大量数据。例如
{
"data": [{
"name": "ABC",
"price": "2.50"
},
...
]
}
我需要去掉价格中的引号,因为 JSON 提要的消费者需要这样。
为此,我正在执行一个正则表达式来查找价格,然后遍历价格并使用 gsub 进行字符串替换。我就是这样做的:
price_strings = json.scan(/(?:"price":")(.*?)(?:")/).uniq
price_strings.each do |price|
json.gsub!("\"#{price.reduce}\"", price.reduce)
end
json
主要的瓶颈似乎在每个区 block 上。有更好的方法吗?
最佳答案
如果此 JSON 字符串将在您的应用程序或代码的另一个第 3 方依赖项(即由您的同事或模块使用)中的某个时刻序列化为 Hash
,我建议与他们协商,当 json 已经是 Hash
时,按需将价格值从 String
转换为 Numeric
,因为这样效率更高,并允许他们...
...处理边缘情况,如果 "price": ""
我下面的代码将不起作用,因为它会删除 ""
,将是一个 JSON 语法错误。
但是,如果您对此没有控制权,或者正在对整个 json 数据进行一次性修改,那么您可以尝试以下操作吗?
json =
<<-eos
{
"data": [{
"name": "ABC",
"price": "2.50",
"somethingsomething": {
"data": [{
"name": "DEF",
"price": "3.25", "someprop1": "hello",
"someprop2": "world"
}]
},
"somethinggggg": {
"price": "123.45" },
"something2222": {
"price": 9.876, "heeeello": "world"
}
}]
}
eos
new_json = json.gsub /("price":.*?)"(.*?)"(.*?,|})/, '\1\2\3'
puts new_json
# =>
# {
# "data": [{
# "name": "ABC",
# "price": 2.50,
# "somethingsomething": {
# "data": [{
# "name": "DEF",
# "price": 3.25, "someprop1": "hello",
# "someprop2": "world"
# }]
# },
# "somethinggggg": {
# "price": 123.45 },
# "something2222": {
# "price": 9.876, "heeeello": "world"
# }
# }]
# }
免责声明:我不是 Regexp 专家。
关于ruby-on-rails - 比用 ruby gsub 替换字符串更有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58323571/