使用 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 不会打印来自通知委托的有效负载

使用 swift 5 从远程读取 json 内容并在 Xcode 的主界面上打印

如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?

在 Swift 中编写一个带有排序键的漂亮打印 JSON 对象

使用 Swift 从 AFNetworking 访问 JSON 数据

将 swift 数组解析为有效的 json