Ruby on rails 比用ruby gsub替换字符串更有效的方法
我有一个巨大的第三方JSON提要—大量数据。乙二醇Ruby on rails 比用ruby gsub替换字符串更有效的方法,ruby-on-rails,json,regex,ruby,string-substitution,Ruby On Rails,Json,Regex,Ruby,String Substitution,我有一个巨大的第三方JSON提要—大量数据。乙二醇 { "data": [{ "name": "ABC", "price": "2.50" }, ... ] } 我需要从价格中去掉引号,因为JSON提要的消费者需要这样做 为此,我将执行一个正则表达式来查找价格,然后迭代价格并使用gsub进行字符串替换。我就是这样做的: price_strings = json.scan(/(?:"price":")(.*?)(?:")/).uniq price_st
{
"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
主要的瓶颈似乎在每个街区。有更好的方法吗?如果此JSON字符串将在应用程序中的某个点或代码的另一个第三方依赖项中序列化为哈希,即供同事或模块使用,我建议与他们协商,在json已经是散列的情况下,按需将价格值从字符串转换为数字,因为这样更有效,并且允许他们 …处理边缘情况,比如说if price:下面的代码将无法工作,因为它将删除,并且将是一个JSON语法错误 但是,如果您无法控制这一点,或者正在对整个json数据进行一次性变异,那么您可以尝试下面的方法吗 json=
如果此JSON字符串将在您的应用程序中的某个点或在代码的另一个第三方依赖项中序列化为散列,即供您的同事或模块使用,我建议与他们协商,在JSON已经是散列的情况下,将价格值从字符串按需转换为数字,因为这样更有效,允许他们 …处理边缘情况,比如说if price:下面的代码将无法工作,因为它将删除,并且将是一个JSON语法错误 但是,如果您无法控制这一点,或者正在对整个json数据进行一次性变异,那么您可以尝试下面的方法吗 json=
这真是愚蠢的差事
JSON.parse('{ "price": 2.50 }')
> {price: 2.5}
从这个javascript示例可以看出,消费端的解析器将把浮点值截断为它想要的任何值
如果要提供格式化的数字或将格式化留给客户端,请使用字符串
事实上,使用浮点数来表示货币被广泛认为是一个非常糟糕的主意,因为浮点数和双倍数不能准确地表示我们用于表示货币的基数10倍。JSON只有一个表示浮点数和整数的数字类型
如果客户要使用该值进行任何类型的计算,您应该使用欧元和美元的最低货币符号美分中的整数,或者消费者将其解释为BigDecimal等效类型的字符串。这真是一件蠢事
JSON.parse('{ "price": 2.50 }')
> {price: 2.5}
从这个javascript示例可以看出,消费端的解析器将把浮点值截断为它想要的任何值
如果要提供格式化的数字或将格式化留给客户端,请使用字符串
事实上,使用浮点数来表示货币被广泛认为是一个非常糟糕的主意,因为浮点数和双倍数不能准确地表示我们用于表示货币的基数10倍。JSON只有一个表示浮点数和整数的数字类型
如果客户机要使用该值进行任何类型的计算,您应该使用欧元和美元的最低货币单位美分中的整数或消费者解释为BigDecimal等效类型的字符串。这是一种非常笨拙的JSON操作方法。您是否尝试过调用JSON.parsejson,然后将其视为它实际表示的对象?您应该能够将json['data']['price']=json['data']['price']]转换为_f,而不是删除引号。即使您希望将其作为字符串进行操作,也没有理由需要创建一个数组并对其进行迭代。只需使用带有捕获的gsub来替换模式的每一次出现。@TomLord-这是我最初的方法。不幸的是,如果我有一个带有尾随零的浮点,那么零就会被修剪。我需要格式2的数字。50@amburnside这没有任何意义。如果使用者需要一个格式化的字符串,那么JSON需要是一个字符串,即2.50。如果消费者很挑剔,想要一个浮动,那么2.5==2.50,所以这绝对没有什么区别。@TomLord完全同意你的观点,但这就是我所说的,这是一种非常笨拙的JSON操作方式。您是否尝试过调用JSON.parsejson,然后将其视为它实际表示的对象?您应该能够将json['data']['price']=json['data']['price']]转换为_f,而不是删除引号。即使您希望将其作为字符串进行操作,也没有理由需要创建一个数组并对其进行迭代。只需使用带有捕获的gsub来替换模式的每一次出现。@TomLord-这是我最初的方法。不幸的是,如果我有一个带有尾随零的浮点,那么零就会被修剪。我需要格式2的数字。50@amburnside这没有任何意义。如果使用者需要格式化的字符串,那么JSO
N需要是一个字符串,即2.50。如果消费者很挑剔,想要一个浮动,那么2.5==2.50,所以应该没有什么区别。@TomLord完全同意你的观点,但我就是这样