如何在 Swift 3 中生成 JSON 字符串?
How to generate JSON string in Swift 3?
我正在尝试向需要此格式的 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 对象数组的 Inputs 对象。
class Image {
var base64 = Dictionary<String, String>()
}
class Data {
var image = Image()
}
class Inputs {
var inputs = [Data]()
}
但是初始化它们并调用 JSONSerialization.data
不起作用,因为这需要一个字典对象。
我现在对引入第 3 方插件不太感兴趣。关于如何使用本机 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 {
}
我正在尝试向需要此格式的 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 对象数组的 Inputs 对象。
class Image {
var base64 = Dictionary<String, String>()
}
class Data {
var image = Image()
}
class Inputs {
var inputs = [Data]()
}
但是初始化它们并调用 JSONSerialization.data
不起作用,因为这需要一个字典对象。
我现在对引入第 3 方插件不太感兴趣。关于如何使用本机 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 {
}