【问题标题】:Remove all indents and spaces from JSON string except inside its value in Ruby从 JSON 字符串中删除所有缩进和空格,除了它在 Ruby 中的值之外
【发布时间】:2021-10-08 07:14:30
【问题描述】:

我有问题的字符串是这样的:

'{\n"test":"AAAA",\n"test2":"BBB\n\n\nBBB"\n}'

我想通过 JSON.parse(jsonstring) 将其解析为 JSON 对象(Hash)
预期的结果是:

{ "test": "AAAA", "test2": "BBB\nB"}

但是,我得到了错误:

JSON::ParserError: 809

我碰巧知道jsonstring中的缩进代码会被转义, 所以我尝试了这个:

escaped_jsonstring = '{\n"test":"AAAA",\n"test2":"BBB\n\n\nBBB"\n}'.gsub(/\R/, '\\n')
JSON.parse(escaped_jsonstring)

我还有 JSON::ParserError。
键或值之外的缩进可能会导致此错误。
如何仅在 Ruby 中的键或值之外删除 \n(或 \r 任何缩进代码)?

这意味着,

'{\n"test":"AAAA",\n"test2":"BBB\n\n\nBBB"\n}' 

'{"test":"AAAA","test2":"BBB\n\n\nBBB"}' 

【问题讨论】:

  • 应用什么规则会导致'"BBB\n\n\nBBB"'转换为"BBB\nB"
  • 感谢您的支持。删除缩进后,"BBB\n\n\nBBB" 仍应为“BBB\n\n\nBBB”。
  • 那个“有问题的”字符串是从哪里来的?
  • 谢谢。用户在 textarea 中输入带有缩进的 json 字符串。所以“有问题的”字符串来自用户的输入。通过从字符串中删除所有缩进,我可以检查它是否是有效的 json 结构。但我不希望 json 键值内有任何缩进或空格。
  • “检查它是否是一个有效的 json 结构”——好吧,它不是。 JSON 要求将字符串中的换行符转义为 \n。因此,在 JSON 字符串中包含未转义的换行符是无效的。这就是你得到错误的原因。与其尝试“修复”格式错误的 JSON,不如让用户粘贴有效的 JSON。

标签: ruby-on-rails json ruby


【解决方案1】:

试试这个

'{\n"test":"AAAA",\n"test2":"BBB\n\n\nBBB"\n}'.gsub(/\B(\\n)+/, "")

\n" 被认为是内部边界(所以我使用\B),同时"\n 被认为是外部边界(\b),(\\n)+ 修复大小写'...,\n\n\n"test2":...

更新 结果\s\n也被认为是内部边界...我不确定还有其他情况...

现在,更新版本

'{\n"test":"AAAA",\n"test2":"BBB \n\n\n BBB"\n}'
 .gsub(/([{,\"]\s*)\B(\\n)+/) { $1 }

更好的方法

我找到了另一种方法来解决您的问题,同样使用regexp,现在我将扫描输入文本(有效或无效的 json),然后按照配对模式进行过滤 "<key>":"<value>" 并且不关心除此之外的任何其他内容对,最后输出哈希

 def format(json)
  matches = json.scan(/\"(?<key>[^\"]+)\":\"(?<val>[^\"]+)\",*/)
  matches&.to_h
 end

 format('{\n "test\n parser":"AA\nAA", \n\n"test2":"BBB ? ;\n\n\n  BBB" \n}')
 # {"test\n parser"=>"AA\nAA", "test2"=>"BBB ? ;\n\n\n  BBB"}

【讨论】:

  • 感谢您的支持。但gsub(/\B(\\n)+/, "") 不能完美运行。当目标字符串为 '{\n"test":"AAAA",\n"test2":"BBB \n\n\n BBB"\n}' 时,结果为 '{"test":"AAAA", “test2”:“BBB BBB”}'。正则表达式删除了值中必要的缩进。
  • @user16012143 在这种情况下,您只想保留\n 或同时保留\s\n
  • 我想同时保留\s\n(这意味着我不想对我的json 中的键或值进行任何更改。)谢谢。
  • @user16012143 尝试新的,但我不确定是否还有其他情况
  • @user16012143 我的错,如果, \n"test2,新的会失败@
猜你喜欢
  • 2014-10-29
  • 1970-01-01
  • 2014-03-01
  • 2013-02-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多