首页 > 解决方案 > 大型 JSON 字符串中的字符串插值

问题描述

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

    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)

我在这里做错了什么?

标签: ruby

解决方案


首先,是#{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 库还为您处理转义。


推荐阅读