0

解析する必要がある JSON フラグメントがあります。

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

そのキーの名前を指定して、任意のキーから値を取得したいと考えています。

私が試してみました:

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

しかし、終了していない文字列がファイルの終わりに達します。

ひもをつかむのを手伝ってくれません12 oz. Cokeか?

4

5 に答える 5

1

文字列を有効な JSON に補間する

JSON#parseと少しの補間を使用して、文字列を通常の Ruby Hashオブジェクトに変換できます。ハッシュは、データを取得するためのあらゆる種類の便利なユーティリティ メソッドを公開します。例えば:

# 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 に答える
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 に答える
0

JSONのすべての形式についてはわかりませんが、1つの方法は

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 に答える