0

我有一个需要解析的 JSON 片段:

fragment = "\"product name\":\"12 oz. Coke\", \"more keys\":\"another value\""

我想从给定键名的任何键中获取值。

我努力了:

fragment.match/\"product name\"\:\"(.+)\"/

但我得到未终止的字符串遇到文件结尾。

你能帮我抓住绳子12 oz. Coke吗?

4

5 回答 5

1

您不需要在正则表达式中转义引号,此外,添加一个 ? 标记以使搜索变得懒惰。这对我有用:

fragment = "\"product name\":\"12 oz. Coke\", \"more keys\":\"another value\""

p fragment[/"more keys":"(.+?)"/, 1] # => "another value"
p fragment[/"product name":"(.+?)"/, 1] # => "12 oz. Coke"

编辑:

另一种方法是将数据放入哈希中:

p Hash[fragment.gsub('"','').split(',').map{|x|x.strip.split(':')}]
# => {"product name"=>"12 oz. Coke", "more keys"=>"another value"}
于 2013-10-18T11:59:56.147 回答
1

您可以在“键值”模式中捕获“值”部分:

str = %q("product name":"12 oz. Coke", "more keys":"another value")
str.scan /".+?":"(.+?)"/
=> [["12 oz. Coke"], ["another value"]]

http://rubular.com/r/Add4Ftf4cJ

于 2013-10-18T14:13:59.190 回答
1

将字符串插入有效的 JSON

您可以使用JSON#parse和一些插值将您的字符串转换为普通的 Ruby哈希对象。哈希将公开各种有用的实用方法来获取您的数据。例如:

# use interpolation to convert to valid JSON, then parse to Hash
fragment = "\"product name\":\"12 oz. Coke\", \"more keys\":\"another value\""
hash = JSON.parse '{%s}' % fragment
#=> {"product name"=>"12 oz. Coke", "more keys"=>"another value"}

# manipulate your new Hash object
hash['product name']
#=> "12 oz. Coke"
hash.keys
#=> ["product name", "more keys"]
hash.values
#=> ["12 oz. Coke", "another value"]
于 2013-10-18T15:10:52.230 回答
0

Just to demonstrate how you might do this using the builtin JSON parser (if that were an option):

require 'json'
fragment = '"product name":"12 oz. Coke", "more keys":"another value"'
hash = JSON.parse('{' + fragment + '}')
hash['product name'] # => "12 oz. Coke"
于 2013-10-18T14:33:53.917 回答
0

我不确定 JSON 的所有格式,但一种方法是

Match the key name  -- probably best to set case insensitive
Match the separator characters
Match anything that is not a termination character into a capturing group:

/product name[\\": ]+([^\\]+)/i

使用您的方法的另一种方法是使捕获组变得懒惰。还要记住,在 Ruby 中,您需要使用 \\ 而不是 \。所以:

/"\\"product name\\":\\"(.+?)\\/i

根据您的数据,您可能还需要打开“点匹配换行符”

/"\\"product name\\":\\"(.+?)\\/mi
于 2013-10-18T11:34:03.043 回答