Write a prettyPrinted JSON object with sorted keys in Swift

前端 未结 4 2212
故里飘歌
故里飘歌 2021-02-08 22:00

We often want to use JSON for human readability. As such, it is common to ask to sort the JSON keys alphabetically (or alphanumerically) in Go, in .NET, in Python, in Java, ...<

4条回答
  •  不要未来只要你来
    2021-02-08 22:39

    Here is one possible workaround that works only for macOS Swift scripts. It is not for iOS.

    We workaround Swift Foundation limitations with a different programming language (Python 2.7 for example).

    import Cocoa
    
    // sample jsonObject
    let jsonObject = ["hello": "world", "foo": "bar"]
    
    // writing JSON to file
    let jsonPath = "myJson.json"
    let outputJSON = OutputStream(toFileAtPath: jsonPath, append: false)!
    outputJSON.open()
    _ = JSONSerialization.writeJSONObject(jsonObject, to: outputJSON, options: [], error: nil)
    outputJSON.close()
    
    // sortedKeys equivalent using `sort_keys=True`
    // prettyPrinted equivalent using `indent=2, separators=(',', ' : ')`
    // unicode using `io.open` and `ensure_ascii=False`
    func shell(_ args: String...) {
        let task = Process()
        task.launchPath = "/usr/bin/env"
        task.arguments = args
        task.launch()
        task.waitUntilExit()
    }
    shell("python", "-c", ""
        + "import io\n"
        + "import json\n"
        + "jsonPath = 'myJson.json'\n"
        + "with io.open(jsonPath, mode='r', encoding='utf8') as json_file:\n"
        + "    all_data = json.load(json_file)\n"
        + "with io.open(jsonPath, mode='w', encoding='utf8') as json_file:\n"
        + "    json_file.write(unicode(json.dumps(all_data, ensure_ascii=False, sort_keys=True, indent=2, separators=(',', ' : '))))\n"
    )
    

提交回复
热议问题