使用 Swift 脚本打印有效的 JSON
Posted
技术标签:
【中文标题】使用 Swift 脚本打印有效的 JSON【英文标题】:Printing valid JSON with a Swift script 【发布时间】:2017-09-17 10:17:00 【问题描述】:我正在尝试在命令行中打印出包含 JSON 对象的变量的内容,就像在代码中一样:
#! /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)
但是,打印出来的是:
[["trigger": "tb ", "name": "Tomboy", "iid": "org.albert.extension.external/v2.0", "dependencies": ["tomboy", "python-pydbus"], "version": "0.1", "author": "Will Timpson"]]
这是无效的,我期待的是这样的:
"version": "0.1", "author": "Will Timpson", "iid": "org.albert.extension.external/v2.0", "trigger": "tb ", "dependencies": ["tomboy", "python-pydbus"], "name": "Tomboy"
如何获得正确的结果?
【问题讨论】:
检查这个:***.com/questions/28325268/… 【参考方案1】:两个问题:
-
您没有最终想要的结构。您有一个包含一个项目的数组,该项目是一个字典。根据您的预期输出,您似乎只需要一本字典。您可以通过删除多余的方括号来解决此问题。
JSON 是一种序列化格式。您没有“JSON 对象”。您有想要序列化为 JSON 的数据。您可以通过
JSONSerialization
做到这一点。
这是产生预期输出的工作代码:
#! /usr/bin/swift
import Foundation
// Drop the extra brackets, and use a type annotation
let metadata: [String: Any] = [
"iid": "org.albert.extension.external/v2.0",
"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"
【讨论】:
本质上,转换为字符串可能会失败。我不确定在实践中这是一个实际问题。您可以使用let JSONString = String(data: jsonData, encoding: String.Encoding.utf8)!
来强制解开该值。【参考方案2】:
Swift 4.2 扩展 多次查找@smarx 解决方案以打印我的 JSON 字符串。 最终完成了扩展
extension Data
func printJSON()
if let JSONString = String(data: self, encoding: String.Encoding.utf8)
print(JSONString)
【讨论】:
【参考方案3】:斯威夫特 4:
例如,如果您想要一个快速肮脏的衬里,检查您将要附加到 http 请求正文的序列化 JSON 数据,那么我使用以下内容:
let json = NSString(data: myJsonObject, encoding: String.Encoding.utf8.rawValue)
print(json)
它打印为清晰的 JSON,没有添加斜线或任何东西!
【讨论】:
【参考方案4】:我建议使用 do catch () 块,并在序列化之前检查它是否是有效的 JSON 对象。
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
()
编码愉快。
【讨论】:
【参考方案5】:如果您使用的是可编码实体,则此 JsonEncoder 对象将打印该 json。
let entity = RequestEntity(...)
do
if let data = try? JSONEncoder().encode(entity)
if let JSONString = String(data: data, encoding: String.Encoding.utf8)
print(JSONString)
【讨论】:
【参考方案6】:我想,我以一种非常简单的方式解决了这个问题。它显示来自 xcode logcat 中对象的格式良好的 json。
let jsonString = object.toJSONString(prettyPrint: true)
print(jsonString as AnyObject)
【讨论】:
以上是关于使用 Swift 脚本打印有效的 JSON的主要内容,如果未能解决你的问题,请参考以下文章
使用 swift 5 从远程读取 json 内容并在 Xcode 的主界面上打印
如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?
在 Swift 中编写一个带有排序键的漂亮打印 JSON 对象