大型JSON字符串中的字符串插值



我正试图替换将用于调用Elastic search的大型搜索字符串中的一个变量,但似乎无法将该变量放入字符串中。以下是我所尝试的,使用字符串插值尝试在3个不同的位置将my_var添加到搜索字符串中。

my_var = "foo"

search_string = '{"query":{"bool":{"must":[{"nested":{"path":"some_status", "query":{"bool":{"must":{"terms":{"status.code":["ACTIVE"]}}}}}}, {"bool":{"should":[{"nested":{"path":"acc", "query":{"bool":{"must":[{"match_phrase":{"acc.name.text":"{#my_var}"}}]}}}}, {"bool":{"must":[{"match_phrase":{"name.stuff":"{#my_var}"}}]}}, {"nested":{"path":"trade_names", "query":{"bool":{"must":[{"match_phrase":{"some_names.some_name.stuff":"{#my_var}"}}]}}}}]}}]}}}'
JSON.parse(search_string)

我在这里做错了什么?

首先,它是#{my_var},而不是{#my_var}

除了打字错误之外,字符串插值还需要"...",它在'...':中被禁用

foo = 123
str = "foo = #{foo}"   # <- turns #{foo} into 123
#=> "foo = 123"
str = 'foo = #{foo}'   # <- keeps #{foo} literally
#=> "foo = #{foo}"

由于您的字符串包含许多文本双引号字符,因此使用"..."会添加许多转义字符。

除了引号,您还可以使用百分比字符串%Q(...):

str = %Q({"foo":"#{foo}"})
#=> "{"foo":"123"}"

或heredoc:(使用JSON作为分隔符可能会在编辑器中启用语法高亮显示(

str = <<-JSON.chomp
{"foo":"#{foo}"}
JSON
#=> "{"foo":"123"}"

另一种选择是构造一个Ruby哈希并将其转换为JSON:

require 'json'
hash = { 'foo' => foo }
str = hash.to_json
#=> "{"foo":123}"

JSON库还为您处理转义。

最新更新