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

时间:2018-02-16 23:29:20

标签: ios json swift clarifai

我正在尝试向需要此格式的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)\"}}}]}"

我的另一个想法是我可以创建一系列嵌入对象:一个包含字典的Data对象;一个包含Data对象的Image对象;和一个包含Data对象数组的Inputs对象。

class Image {
    var base64 = Dictionary<String, String>()
}

class Data {
    var image = Image()
}

class Inputs {
    var inputs = [Data]()
}

但是初始化它们并调用JSONSerialization.data不起作用,因为这需要一个字典对象。

我现在对拉入第三方插件并不感兴趣。关于如何使用本机iOS库将这些嵌套对象转换为json的任何想法?

1 个答案:

答案 0 :(得分:2)

绝对!在Swift 4中使用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 { } 可以解决问题:

JSONSerialization.data

如果Swift 3是您唯一的选择,那么您必须让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 { } 工作:

vue-cli