插入JSON字符串会删除JSON引用

时间:2018-06-13 20:12:10

标签: json ruby

我有以下两行代码:

json_str = _cases.to_json
path += " #{USER} #{PASS} #{json_str}"

当我使用调试器时,我注意到json_str似乎被格式化为JSON:

"[["FMCE","Wiltone","Wiltone","04/10/2018","Marriage + - DOM"]]"

但是,当我将其插入另一个字符串时,会删除引号:

"node superuser 123456 [["FMCE","Wiltone","Wiltone","04/10/2018","Marriage + - DOM"]]" 

为什么字符串插值会从JSON字符串中删除引号,我该如何解决?

我确实找到了一个问题的解决方案,即手动转义字符串:

json_str = _cases.to_json.gsub('"','\"')
path += " #{USER} #{PASS} \"#{json_str}\""

所以基本上我逃避了to_json调用中生成的双引号。然后我在插值变量周围手动添加两个转义引号。这将产生预期的结果:

node superuser 123456 "[[\"FMCE\",\"Wiltone\",\"Wiltone\",\"04/10/2018\",\"Marriage + - DOM\"]]" 

注意集合周围的外部引号是如何转义的,但集合中的字符串是如何转义的。这将使JavaScript能够使用JSON.parse解析它。

重要的是要注意这一部分:

json_str = _cases.to_json.gsub('"','\"')

它正在添加一个LITERAL反斜杠。不是逃避序列。

但在这一部分:

path += " #{USER} #{PASS} \"#{json_str}\""

\"包装插值变量是一个转义序列而不是文字反斜杠。

2 个答案:

答案 0 :(得分:0)

为什么你认为第一个和最后一个引号是字符串的一部分?它们不属于JSON格式。您的程序行为对我来说是正确的。

(或者更准确地说,你的程序似乎完全按照你所说的去做。你的指示是否有用是一个我无法回答的问题。)

答案 1 :(得分:0)

很难用小样本来判断,但看起来您可能会从调试器输出中获取引号。假设.to_json的输出是一个字符串(通常是),那么"#{json_str}"应该完全等于json_str。如果不是,那就是红宝石中的一个错误(可疑)。

如果需要引号,则需要手动添加它们或使用适合您的用例的任何转义函数来转义字符串。您可以使用.to_json作为转义函数(例如"#{json_str.to_json}")。