Printing valid JSON with a Swift script

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": "", "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": "", "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": "", "trigger": "tb ", "dependencies": ["tomboy", "python-pydbus"], "name": "Tomboy"}
  • How to achieve the proper result?
1

6 Answers

Two issues:

  1. You don't have the structure you ultimately want. You have an array with one item in it, and that item is a dictionary. Based on your expected output, you seem to just want a dictionary. You can fix this by dropping the extra square brackets.
  2. JSON is a serialization format. You don't have "a JSON object." You have data that you would like to serialize as JSON. You can do that with JSONSerialization.

Here's working code that produces the expected output:

#! /usr/bin/swift
import Foundation
// Drop the extra brackets, and use a type annotation
let metadata: [String: Any] = [ "iid": "", "name": "Tomboy", "version": "0.1", "author": "Will Timpson", "dependencies": ["tomboy", "python-pydbus"], "trigger": "tb"
]
// Serialize to JSON
let jsonData = try JSONSerialization.data(withJSONObject: metadata)
// Convert to a string and print
if let JSONString = String(data: jsonData, encoding: String.Encoding.utf8) { print(JSONString)
}
// Output:
// {"iid":"org.albert.extension.external\/v2.0","name":"Tomboy","version":"0.1","dependencies":["tomboy","python-pydbus"],"author":"Will Timpson","trigger":"tb"}
1

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)

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like