从 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 字符串中删除除值中的空格之外的所有空格?