如何在Swift 3中从Struct数组制作JSON?

How to Make JSON from Array of Struct in Swift 3?

在从Swift3中的结构数组制作JSON时遇到问题。我在Stack Overflow中搜索,没有任何帮助(这里是屏幕截图)。我有这样的struct

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public struct ProductObject {
    var prodID: String
    var prodName: String
    var prodPrice: String
    var imageURL: String
    var qty: Int
    var stock: String
    var weight: String

    init(prodID: String, prodName: String, prodPrice: String, imageURL: String, qty: Int, stock: String, weight: String){
        self.prodID = prodID
        self.prodName = prodName
        self.prodPrice = prodPrice
        self.imageURL = imageURL
        self.qty = qty
        self.stock = stock
        self.weight = weight
    }
}

以及该结构的数组:

1
private var productsArray = [ProductObject]()

当数组不为空时,然后我尝试在另一个类中打印它,它在调试器中显示:

1
[app.cartclass.ProductObject(prodID:"2", prodName:"produk 2", prodPrice:"IDR 1000000", imageURL:"someURL", qty: 1, stock:"11", weight:"200")]

该数组不是有效的JSON object。如何使其成为有效的JSON对象?而且我想知道这部分" app.cartclass.ProductObject"是否有问题,以使其不能成为有效的JSON object

编辑:

这是我序列化为JSON的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var products = [String:Any]()
    for j in 0 ..< cart.numberOfItemsInCart()  {
        products=["\\(j)":cart.getAllProduct(atIndex: j)]
    }
    if let valid = JSONSerialization.isValidJSONObject(products) {
        do {
            let jsonproducts = try JSONSerialization.data(withJSONObject: products, options: .prettyPrinted) as! [String:Any]
            //print(jsonproducts)
        } catch let error as NSError {
            print(error)
        }
     } else {
         print("it is not a valid JSON object");
     }


如果要使用自定义对象创建JSON,则首先需要将自定义对象转换为Dictionary,因此请在ProductObject结构中创建一个如下所示的函数。

1
2
3
4
func convertToDictionary() -> [String : Any] {
    let dic: [String: Any] = ["prodID":self.prodID,"prodName":self.prodName,"prodPrice":self.prodPrice,"imageURL":self.imageURL,"qty":qty,"stock":stock,"weight":weight]
    return dic
}

现在使用此功能从自定义对象ProductObject的数组生成字典数组。

1
2
private var productsArray = [ProductObject]()
let dicArray = productsArray.map { $0.convertToDictionary() }

此处dicArray由类型[[String:Any]]组成,现在您可以使用JSONSerialization从此dicArray生成JSON字符串。

1
2
3
4
if let data = try? JSONSerialization.data(withJSONObject: dicArray, options: .prettyPrinted) {
    let str = String(bytes: data, encoding: .utf8)
    print(str)
}