Printing valid JSON with a Swift script

Viewed 27545

I am attempting to print out in the command line the contents of a variable that holds a JSON object, like in the code:

#! /usr/bin/swift
import Glibc
import Foundation

let albert_op = ProcessInfo.processInfo.environment["ALBERT_OP"]!


if albert_op == "METADATA" {
    let metadata = [
        ["iid": "org.albert.extension.external/v2.0",
        "name": "Tomboy",
        "version": "0.1",
        "author": "Will Timpson",
        "dependencies": ["tomboy", "python-pydbus"],
        "trigger": "tb "]
    ]
    print(metadata))
}


exit(0)

However, that prints out:

[["trigger": "tb ", "name": "Tomboy", "iid": "org.albert.extension.external/v2.0", "dependencies": ["tomboy", "python-pydbus"], "version": "0.1", "author": "Will Timpson"]]

Which is not valid, I was expecting something like:

{"version": "0.1", "author": "Will Timpson", "iid": "org.albert.extension.external/v2.0", "trigger": "tb ", "dependencies": ["tomboy", "python-pydbus"], "name": "Tomboy"}
  • How to achieve the proper result?
6 Answers

Swift 4.2 Extension
Looked up @smarx solution a lot of times to print my JSON string. Eventually ended up making an extension

extension Data
{
    func printJSON()
    {
        if let JSONString = String(data: self, encoding: String.Encoding.utf8)
        {
            print(JSONString)
        }
    }
}

Swift 4:

If you want a quick dirty one liner just for example, checking the serialised JSON Data you are about to attach to a http request body then I use the following:

let json = NSString(data: myJsonObject, encoding: String.Encoding.utf8.rawValue)
print(json)

It prints as clear JSON, no added slashes or anything!

I would recommend using do {} catch { () } block, and before serialization do check if its a valid JSON object.

           do {

                    if let result = responseObj.result, JSONSerialization.isValidJSONObject(result) {

                        let jsonData = try JSONSerialization.data(withJSONObject: result)

                        // Convert to a string and print
                        if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) {
                            print(JSONString)
                        }
                    }
                } catch {
                    ()
                }

Happy coding.

if you are using encodable entity, this JsonEncoder object will print that json.

let entity = RequestEntity(...)
do {
     if let data = try? JSONEncoder().encode(entity) {
        if let JSONString = String(data: data, encoding: String.Encoding.utf8) {
           print(JSONString)
        }
      }
   } 

I guess, I solved this in a very easy way. It shows well formatted json from object in xcode logcat.

let jsonString = object.toJSONString(prettyPrint: true)
print(jsonString as AnyObject)
Related