将“漂亮打印”的JSON字符串转换为紧凑格式表示的最简单方法是什么?

3
这可能是一个奇怪的问题,因为它与JSON字符串本身有关,而不是它们所代表的对象。给定一个“漂亮打印”的JSON字符串(表示任何可JSON编码模型),如何将其重新格式化为“紧凑”格式?
我的第一反应是不将其视为JSON,而只是一个字符串,然后使用正则表达式删除重复空格、删除换行符等,但这不是上下文感知的,因此如果您没有适当地测试是否在引号内,它会影响JSON的键和值部分。
我的下一个想法是尝试从JSON构造一个对象,但是由于没有要转换的类型,我不确定如何做到这一点,除非手动将值解析为“ANY”,然后测试它们是否为数组,如果是,则递归进入其中,重复此过程。然后,一旦我获得最终对象,就以紧凑形式序列化结果。但是,那似乎太过于繁琐了。
是否有更简单的方法来完成这个任务?如果需要,我们正在使用Swift 4。
1个回答

0

更新:

正如@Mark A. Donohoe所指出的那样,这将删除所有空格。因此,尽管它看起来很酷,但这是一个愚蠢的答案。不要上当。


我也需要同样的东西,最终我创建了一个字符串扩展:

<s>extension String {
    func toCompactJSON() -> String {
        self.filter { !$0.isWhitespace && !$0.isNewline }
    }
}</s>

在我的情况下,虽然它是为了测试目的而使用,但结果证明它是无用的,因为 Javascript 对象/数组出现的顺序与通过 JSONEncoder 生成时不同。


1
你的代码不会移除字符串中的空格吗?例如,{"value":"This is a test"} 将变成 {"value":"Thisisatest"}。但你说这种方法行不通。 (顺便说一句:出于这个原因,你可能想要删除这段代码,这样你就不会被踩了,从而影响你的声誉。这里的人并不总是很友善。)另外,你可能想把这样的东西放在一个 JSONHelper 类中,而不是扩展 String,因为扩展应该对任何实例都有意义,而不是像这里的 JSON 一样只针对特定用例。这只是我的个人意见,但它已经为我服务了很好,并保持了 API 的清晰度。 - Mark A. Donohoe
1
@MarkA.Donohoe 哦,非常好的观点。目前我的测试很少,我还没有涉及到复杂的测试。这个空格问题以后会变得更加清晰。谢谢。也感谢您提出了 JSONHelper 的想法。我很新于 Swift,来自 PHP,但我主要只是通过 TDD 进行开发,并构建足够使测试通过的内容。然后再进行重构。目前我的 extension 甚至在测试文件中。我会将其移动到更深的路径下,并可能会为其创建一个类。关于声誉,不用担心。不需要批准。我会尝试自己解决 :D - godbout

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