首页 > 解决方案 > 将字典数组转换为对象数组

问题描述

我有一个这种形式的字符串:

[{"LocationsItems":[{"ItemId":4,"LocationId":3,"Qty":34},{"ItemId":19,"LocationId":3,"Qty":55}]}];

我需要将其转换为对象数组,我试过这个:

let data = convertedData.data(using: .utf8)!
        do {
            if let jsonArray = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>]
            {
                print(jsonArray)

            } else {
                print("bad json")
            }
        } catch let error as NSError {
            print(error)
        }
    }

并返回 this ,它是一个字典数组:

[["LocationsItems": <__NSArrayI 0x600003a1c100>(
{
    ItemId = 4;
    LocationId = 3;
    Qty = 34;
},
{
    ItemId = 19;
    LocationId = 3;
    Qty = 55;
}
)
]]

我怎样才能从中提取对象?谢谢

标签: iosswift

解决方案


您可以创建一个LocationItem.

struct LocationItem {
    var itemId: Int?
    var locationId: Int?
    var qty: Int?    
}

var innerDictionary = jsonArray[0] as? [String: Any]
var arrayOfDict = innerDictionary["LocationsItems"] as? [[String: Any]]

var locationsItems = arrayOfDict.map { 
    LocationItem(itemId: $0["ItemId"], locationId: $0["LocationId"], qty: $0["Qty"]) 
}

或者,您可以使用Codable

struct LocationItem: Codable {
    var itemId: Int?
    var locationId: Int?
    var qty: Int?

    enum CodingKeys: String, CodingKey {
        case itemId = "ItemId"
        case locationId = "LocationId"
        case qty = "Qty"
    }
}

let decoder = JSONDecoder()

do {
    let responseStructure = try decoder.decode([[String:[[String:Any]]]], from: data)
} catch {
    // failed
}

let locationItems = responseStructure[0]["LocationsItems"]

推荐阅读