【问题标题】:How do I remove backslashes from a JSON string?如何从 JSON 字符串中删除反斜杠?
【发布时间】:2013-08-20 00:50:46
【问题描述】:

我有一个如下所示的 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 字符串的检查输出。

标签: ruby json string escaping


【解决方案1】:

为避免在控制台中生成带有反斜杠的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"
}

【讨论】:

  • puts 返回nil,那么如何将没有反斜杠的字符串保存到变量中?或者我如何将它发送到某个地方?
  • Viktor:你可以使用 StringIO 写入字符串
  • Hmmm...我在输入我的真实代码后不断得到转义,尽管它在我做一个简单的测试时有效。令人沮丧——我可能不得不求助于修改字符串来删除封闭的引号和黑斜线,就像 Chris 的回答中一样
【解决方案2】:

我尝试了早期的方法,但它们似乎没有解决我的问题。我的 json 仍然有反斜杠。但是,我找到了解决此问题的方法。

myuglycode.gsub!(/\"/, '\'')

【讨论】:

    【解决方案3】:

    使用gsub 将所有反斜杠替换为空字符串:

    json.gsub('\\', '')
    

    请注意,REPL 中的默认输出使用inspect,它会将字符串双引号并仍然包含反斜杠以转义双引号。使用puts 查看字符串的确切内容:

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

    此外,请注意,这将删除 所有 反斜杠,并且不考虑它们的上下文。您可能希望只删除双引号前的反斜杠,在这种情况下您可以这样做:

    json.gsub('\"', '')
    

    【讨论】:

    • 当 Little Bobby Tables 将 \" 放入其中一个 JSON 值时,第二个会出现问题。
    • @muistooshort 对。与往常一样,这有点随意。我想真正的问题是:为什么 JSON 首先是这样的? (哎呀,刚刚在:)上面看到你的评论)。
    【解决方案4】:

    我需要将漂亮的 JSON 数组打印到文件中。我创建了一个 JSON 对象数组,然后需要打印到一个文件供 DBA 操作。

    我就是这样做的。

    puts(((dirtyData.gsub(/\\"/, "\"")).gsub(/\["/, "\[")).gsub(/"\]/, "\]"))
    

    这是一个三重嵌套的 gsub,首先删除 \" 然后删除 [" 最后删除 "]

    希望对你有帮助

    【讨论】:

    • 我怀疑这有点快:to_json.delete!('\\').sub!(/^"(.+)"$/, "#{$1}" 你可以据我所知,不要在评论中格式化
    【解决方案5】:

    使用 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"}]}}}
    

    【讨论】:

      【解决方案6】:

      使用 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”双引号才能工作,否则\" 将按原样读取,而不是“翻译”为返回" 的"。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        相关资源
        最近更新 更多