如何在 swift 3 中将具有自定义类的数组转换为 JSON

Posted

技术标签:

【中文标题】如何在 swift 3 中将具有自定义类的数组转换为 JSON【英文标题】:How can I convert an array with custom classes to JSON in swift 3 【发布时间】:2017-01-11 18:43:43 【问题描述】:

我需要在 swift 3 中创建以下 json 并且我不想使用外部库。 我尝试了this answer,但我在数组中使用了自定义类(商店和产品),所以它不起作用。

"order": 
    [
        "store": 1,
        "product": [ 
        
            "id": 1,
            "quantity": 1 
        ,
        
            "id": 2,
            "quantity": 5 
        ]
    ,
    
        "store": 4, 
        "product": [ 
            "id": 1,
            "quantity": 1 
        ,
        
            "id": 3,
            "quantity": 1 
        ]
    ]

【问题讨论】:

How to Make JSON from Array of Struct in Swift 3?的可能重复 【参考方案1】:

很确定您可以通过以下方式完成此操作:

1) 在对象的类中创建一个 toJSON() 函数

2) 在这个对象中创建一个字典来存储属性及其值。

这是基于您的 json 示例的几个小类的示例:

class Order 

    var store: Store!
    var products: [Product]!

    init(store: Store, products: [Product]) 
        self.store = store
        self.products = products
    

    func toJSON() -> [String : Any] 
        var dictionary: [String : Any] = [:]

        dictionary["store"] = store.toJSON()

        var productsDictionary: [Int : Any] = [:]

        for index in 0...self.products.count - 1 
            let product: Product = products[index]
            productsDictionary[index] = product.toJSON()
        

        dictionary["product"] = productsDictionary

        return dictionary
    



class Store 

    var id: Int!

    init(id: Int) 
        self.id = id
    

    func toJSON() -> [String:Any] 
        var dictionary: [String : Any] = [:]

        dictionary["id"] = self.id

        return dictionary
    


class Product 
    var id: Int!
    var quantity: Int!

    init(id: Int, quantity: Int) 
        self.id = id
        self.quantity = quantity
    

    func toJSON() -> [String:Any] 
        var dictionary: [String : Any] = [:]

        dictionary["id"] = self.id
        dictionary["quantity"] = self.quantity

        return dictionary
    

3) 按照您发布的示例链接进行操作

NSJSONSerialization.dataWithJSONObject(order.toJSON(), options: nil, error: nil)

【讨论】:

如果我想要一系列产品怎么办?我该怎么做?现在它只增加了 1 个产品和 1 个商店。 肯定有几种方法可以做到这一点。您可以在 Order.toJSON() 函数中遍历您的产品数组并将每个产品添加到字典中。有关示例,请参阅我对 Order 对象的编辑。不过,可能需要进行一些重组,具体取决于您希望如何将产品存储在 JSON 对象中。 @Marchu 如果我可以做更多的事情来使这个答案更容易接受,请告诉我。如果此答案满足您的需求,请标记为正确。谢谢!【参考方案2】:

向您的类添加一个名为“ToDictionary”的方法,该方法返回一个用您的字段和值手工编码的字典。然后只需在该字典上调用 NSJSONSerialization 即可。在 ObjC 下你可以使用反射,但现在还没有……

【讨论】:

参考这个进行反思 - appventure.me/2015/10/24/swift-reflection-api-what-you-can-do

以上是关于如何在 swift 3 中将具有自定义类的数组转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 5 中将文档转换为自定义对象?

如何在 Swift 中将数据转换为 Doubles、Ints 和 Strings 等类型?

如何在 Swift 中将数值数据数组转换为 RAW 图像数据?

如何在flutter中将具有文档ID的自定义对象设置为firestore中的集合?

如何在 Swift 中将单个数组转换为嵌套数组? [复制]

在 swift 中将 String 类型数组转换为 Float 类型数组 不能将类型 'String' 的值分配给类型 'Double' 的下标。