从 JSON 字符串中删除所有缩进和空格,除了它在 Ruby 中的值之外

Posted

技术标签:

【中文标题】从 JSON 字符串中删除所有缩进和空格,除了它在 Ruby 中的值之外【英文标题】:Remove all indents and spaces from JSON string except inside its value in 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。 【参考方案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,新的会失败@

以上是关于从 JSON 字符串中删除所有缩进和空格,除了它在 Ruby 中的值之外的主要内容,如果未能解决你的问题,请参考以下文章

从 JSON 字符串中删除所有不必要的空格(在 PHP 中)

JavaScript:如何从 JSON 字符串中删除除值中的空格之外的所有空格?

自动从 html 中删除缩进、不需要的空格(缩小)

如何从PHP和Javascript中的字符串中删除所有空格[重复]

从 SQL Server 中的字符串中删除所有空格

Kubernetes------YAML