ruby-on-rails - 比用 ruby​​ gsub 替换字符串更有效的方法

标签 ruby-on-rails json regex ruby string-substitution

我有一个庞大的第三方 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/

相关文章:

ruby-on-rails - 覆盖类和实例方法的 method_missing?

ruby-on-rails - 如何在 Rails 中将日期格式化为 JSON?

javascript - 使用Angular提取特定的Json数据

javascript - 查找 <colgroup> 的正则表达式组

javascript - 替换字符串中不同字符的函数

jquery - 在两个不同的部分 想传递两个变量

ruby-on-rails - 添加指向 simple_form 提示的链接?

javascript - 如何在 vuejs 中搜索嵌套的 JSON 数据?

ios - 如何使用 JSONModel 获取 NSArray 对象

sql - 匹配正则表达式中的数字 (Oracle SQL)