如何在Swift 3中生成JSON字符串



我正在尝试向需要此格式的API发送请求:

{
    "inputs": [
        {
            "data": {
                "image": {
                    "base64": "iVBORw0KGgoAAAIVnFT/DPAAAAAElFTkSuQmCC..."
                }
            }
        }
    ]
}

这是我在Swift 3:

中尝试的
let base64 = ["base64": "1010101..."]
let image: [String: Any] = ["image": base64]
let data: [String: Any] = ["data": image]
var input = [Dictionary<String, Any>]()
input = [data]
let jsonData = try! JSONSerialization.data(withJSONObject: input, options: .prettyPrinted)

试图碰到端点时,我遇到了无效的请求错误。毫不奇怪 - 当我打印它时:

let jsonString = try! JSONSerialization.jsonObject(with: jsonData, options: [])
print(jsonString)

它产生了这样的字符串:

(
        {
        data =         {
            image =             {
                base64 = 1010101;
            };
        };
    }
)

目前,我正在滚动自己的字符串。它有效...但是这很丑

let imageAsString = "{"inputs": [{"data": {"image": {"base64": "(strBase64)"}}}]}"

我的另一个想法是,我可以创建一系列嵌入式对象:包含字典的数据对象;保存数据对象的图像对象;以及容纳数据对象数组的输入对象。

class Image {
    var base64 = Dictionary<String, String>()
}
class Data {
    var image = Image()
}
class Inputs {
    var inputs = [Data]()
}

但是,将它们全部初始化并调用JSONSerialization.data不起作用,因为这采用了字典对象。

我现在对暂时删除第三方插件并不真正感兴趣。关于如何使用本机iOS库将这些嵌套对象转换为JSON的任何想法?

绝对!在Swift 4中使用Codable协议和JSONEncoder将有能力:

struct ImageObj: Codable {
    let base64: String
}
struct DataObj: Codable {
    let image: ImageObj
}
struct InputObj: Codable {
    let data: DataObj
}
struct InputsContainerObj: Codable {
    let inputs: [InputObj]
}
let imageObj = ImageObj(base64: "abc123")
let dataObj = DataObj(image: imageObj)
let inputObj = InputObj(data: dataObj)
let inputsContainerObj = InputsContainerObj(inputs: [inputObj])
let encoder = JSONEncoder()
do {
    let jsonData = try encoder.encode(inputsContainerObj)
    let jsonString = String(data: jsonData, encoding: .utf8)!
    print(jsonString) //{"inputs":[{"data":{"image":{"base64":"abc123"}}}]}
} catch _ as NSError {
}

如果Swift 3是您的唯一选择,那么您将必须使JSONSerialization.data工作:

let dict = ["inputs": [["data": ["image": ["base64": "abc123"]]]]]
do {
    let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)
    let jsonString = String(data: jsonData, encoding: .utf8)!
    print(jsonString)
    /*
    {
        "inputs" : [
            {
            "data" : {
                "image" : {
                    "base64" : "abc123"
                }
            }
            }
        ]
    }
    */
} catch _ as NSError {
}

最新更新