如何从 JSON 字符串中删除反斜杠?

14

我有一个看起来像以下JSON字符串:

'{\"test\":{\"test1\":{\"test1\":[{\"test2\":\"1\",\"test3\": \"foo\",\"test4\":\"bar\",\"test5\":\"test7\"}]}}}'

我需要使用 Ruby 或 Rails 将它更改为下面的内容:

'{"test":{"test1":{"test1":[{"test2":"1","test3": "foo","test4":"bar","test5":"bar2"}]}}}'

我需要知道如何删除那些斜杠。


那看起来非常像一个正确的JSON字符串的检查输出。 - the Tin Man
6个回答

42
为了避免在控制台生成带有反斜杠的 JSON,请使用 puts
> hash = {test: 'test'}
=> {:test=>"test"}

> hash.to_json
 => "{\"test\":\"test\"}"

> puts hash.to_json
{"test":"test"}

你也可以使用 JSON.pretty_generate,当然需要加上puts

> puts JSON.pretty_generate(hash)
{
  "test": "test"
}

2
puts 返回 nil,那么我该如何将一个没有反斜杠的字符串保存到变量中呢?或者我该如何将它发送到某个地方? - Viktor
维克多:你可以使用StringIO将内容写入字符串中。 - Russell Fulton
哦,我在真正的代码中通过puts后仍然得到转义字符,尽管在简单测试时它是有效的。这很令人沮丧 - 我可能不得不像Chris的答案那样搞乱字符串以删除引号和反斜杠。 - Russell Fulton

8
使用 Ruby 的 String#delete! 方法。例如:
str = '{\"test\":{\"test1\":{\"test1\":[{\"test2\":\"1\",\"test3\": \"foo\",\"test4\":\"bar\",\"test5\":\"test7\"}]}}}'
str.delete! '\\'
puts str
#=> {"test":{"test1":{"test1":[{"test2":"1","test3": "foo","test4":"bar","test5":"test7"}]}}}

7
使用 gsub 将所有反斜杠替换为空字符串:
json.gsub('\\', '')

请注意,REPL中的默认输出使用inspect,它将对字符串进行双引号,并仍然包括反斜杠来转义双引号。使用puts查看字符串的确切内容:
{"test":{"test1":{"test1":[{"test2":"1","test3": "foo","test4":"bar","test5":"test7"}]}}}
此外,请注意,这将删除所有反斜杠,并不考虑它们的上下文。您可能希望仅删除在双引号前面的反斜杠,在这种情况下,您可以执行以下操作:
json.gsub('\"', '')

еҪ“Little Bobby TablesеңЁJSONеҖјдёӯж”ҫзҪ®\"ж—¶пјҢ第дәҢдёӘе°ҶдјҡеҮәзҺ°й—®йўҳгҖӮ - mu is too short
@muistooshort 没错。一如既往,这有点仓促。我想真正的问题是:为什么JSON一开始就是这样的呢?(哎呀,刚看到你上面的评论 :))。 - Andrew Marshall

3
我需要将一个漂亮的JSON数组打印到文件中。我创建了一个JSON对象数组,然后需要将其打印到文件中以便DBA进行处理。
这是我的解决方案。
puts(((dirtyData.gsub(/\\"/, "\"")).gsub(/\["/, "\[")).gsub(/"\]/, "\]"))

这是一个三重嵌套的gsub,先删除“\”符号,然后删除“[”,最后删除“]”

我希望这可以帮到你


我怀疑这个更快一些:to_json.delete!('\').sub!(/^"(.+)"$/, "#{$1}",据我所知你不能在注释中进行格式化。 - Russell Fulton

1
我尝试了之前的方法,但似乎并没有解决我的问题。我的JSON仍然有反斜杠。然而,我找到了一个解决此问题的方法。 myuglycode.gsub!(/\"/, '\'')

1
使用 JSON.parse()。
JSON.parse("{\"test\":{\"test1\":{\"test1\":[{\"test2\":\"1\",\"test3\": \"foo\",\"test4\":\"bar\",\"test5\":\"test7\"}]}}}")
> {"test"=>{"test1"=>{"test1"=>[{"test2"=>"1", "test3"=>"foo", "test4"=>"bar", "test5"=>"test7"}]}}}

注意,为了使此功能正常工作,"json-string" 必须用双引号括起来,否则 \" 将被视为原样读取,而不是被 "转换" 为 ",这会返回一个 JSON::ParserError 异常

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接