【问题标题】:What's the easiest way to convert a 'pretty printed' JSON string to a compact format representation?将“漂亮打印”的 JSON 字符串转换为紧凑格式表示的最简单方法是什么?
【发布时间】:2018-07-17 14:36:04
【问题描述】:

这可能是一个奇怪的问题,因为它特定于 JSON 字符串本身,而不是它们所代表的对象。给定一个“漂亮打印”的 JSON 字符串(代表 任何 JSON 编码模型),如何将其重新格式化为“紧凑”格式?

我的第一个想法是不考虑 JSON,而只是一个字符串,然后使用 RegEx 删除重复空格、删除换行符等,但这不是上下文感知的,因此它可能会影响 JSON 的键和值部分如果您没有正确测试您是否在引号内。

我的下一个想法是尝试从 JSON 构造一个对象,但没有要转换的类型,我不确定如何在不手动将值解析为“ANY”的情况下执行此操作,然后测试它们是否是一个数组,如果是,则递归到其中,重复该过程。然后,一旦我有了最终对象,就以紧凑的形式序列化结果。但是,这似乎有些矫枉过正。

有没有更简单的方法来做到这一点?如果有帮助,我们正在使用 Swift 4。

【问题讨论】:

    标签: json swift format


    【解决方案1】:

    更新

    正如@Mark A. Donohoe 所指出的,这会删除所有空格。所以即使它看起来很酷,这是一个愚蠢的答案。不要上当。


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

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

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

    【讨论】:

    • 您的代码不会删除字符串中的空格吗?例如,{"value":"This is a test"} 将变为 {"value":"Thisisatest"}。然后你又说这不起作用。 (旁注:出于这个原因,您可能希望删除它,这样您就不会被否决,这会影响您的代表。它们在这里并不总是最好的。)另一个旁注,您可能想要放置这样的东西在 JSONHelper 类中而不是扩展 String 作为扩展通常对任何实例都有意义,而不是特定用例,例如此处的 JSON。纯属意见,但它对我很有帮助,并保持 API 表面清洁。
    • @MarkA.Donohoe 啊,是的。很好的一点。目前我的测试很少,我还没有接触过复杂的测试。稍后会明确该空白问题。谢谢。也感谢JSONHelper 的想法。我对 Swift 非常陌生,来自 PHP,但我主要只是通过 TDD,并且只构建足以使测试通过的东西。并在以后重构。目前我的extension 甚至在测试文件中。会把它移到更远的地方,并且可能会为它创建一个类,是的。关于声誉,不用担心。不需要批准。我会自己尝试 dv :D
    猜你喜欢
    • 2018-06-21
    • 2013-01-09
    • 2014-08-24
    • 2012-01-07
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2017-02-14
    相关资源
    最近更新 更多