ruby - 大型 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)
我在这里做错了什么?
解决方案
首先,是#{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 库还为您处理转义。
推荐阅读
- c++ - 即使在 Linux 上安装了 mingw 包,gcc 也无法找到“windows.h、winsock2.h 和 ws2tcpip.h”头文件
- lua - CS50 游戏赛道:马里奥
- javascript - Highchart spline 达到最大刻度值时切断。怎么可能固定?我在正文上附上了可能的示例代码
- node.js - 如何从 postgres/typeorm 中选择包含传入字符串的数组的记录
- build.gradle - 无法获取 org.gradle.api.internal.initialization.DefaultScriptHandler 类型的对象的未知属性
- javascript - 在反应导航 5.x 上动态更改标题标题
- pytorch - Python到一个exe文件
- macos - tensorflow 2 通过 conda 在 mac 上安装
- java - 将用户详细信息作为会话范围 bean 注入
- c# - 委托对 NULL 的引用