swift更新字典值3
问题描述:
{
"error": false,
"error_msg": "Get trending data.",
"Total_category": 2,
"responseData": [
{
"categoryName": "Trending",
"Trending": [
{
"category": "Trending",
"trailerPrice": "",
"isFavourit": null,
"isWatchlist": null
}
]
},
{
"categoryName": "Comedy",
"Comedy": [
{
"category": "Comedy",
"trailerPrice": "",
"isFavourit": null,
"isWatchlist": null
}
]
}
]
}
我需要为特定的密钥更新内容**("isFavourit")**
,请问swift 3中怎么可能?只更新responseData-> index[1]->comedy[]-> "isFavourit" null to 1
。swift更新字典值3
我可以像这样设置字典的值 responseData[1][Comedy]![0]["isFavourit"] = 1
不能在swift3中工作。
如何设置“isFavourit”值1?
我只是试图像
(arrVideoDetail[1]["comedy"] as! [Dictionary<String,Any>])[0]["isFavourit"] = 1
上面的代码显示错误不能分配给类型为“任何一成不变的表情?
答
这真是糟糕的JSON。问题是responseData
阵列中的字典没有一致的密钥。第一个具有键
"categoryName": "Trending",
"Trending": [
但第二个具有关键
"categoryName": "Comedy",
"Comedy": [
这意味着,你不知道第二项的名称,直到你拉出categoryName
键的值。所以你必须停下来,然后才能继续下去。
所以,让我们假设你有一个叫做json
的字符串。然后:
let d1 = try! JSONSerialization.jsonObject(with: json.data(using: .utf8)!)
let a1 = (d1 as! [String:Any])["responseData"]
let d2 = (a1 as! [[String:Any]])[1]
let key = d2["categoryName"] as! String // "Comedy"
let a2 = d2[key]!
var d3 = (a2 as! [[String:Any]])[0]
// ["isWatchlist": <null>, "trailerPrice": , "isFavourit": <null>, "category": Comedy]
现在d3
是你正在寻找的内部字典,您可以根据需要修改它。
顺便说一句,这是你的JSON是为什么这一切会是如此好得多斯威夫特4.我们可以将整个JSON解析成一个自定义结构的性能的很好的例子:
struct MyJson : Decodable {
let error : Bool
let error_msg : String
let Total_category : Int
let responseData : [ResponseData]
struct ResponseData : Codable {
let categoryName : String
let unknown : [Inner]
struct Inner : Codable {
let category : String
let trailerPrice : String
let isFavourit : String?
let isWatchList : String?
}
private struct CK : CodingKey {
var stringValue: String
init?(stringValue: String) { self.stringValue = stringValue }
var intValue: Int?
init?(intValue: Int) { return nil }
}
init(from decoder: Decoder) throws {
let con = try! decoder.container(keyedBy: CK.self)
self.categoryName = try! con.decode(String.self, forKey:CK(stringValue:"categoryName")!)
let key = self.categoryName
self.unknown = try! con.decode([Inner].self, forKey: CK(stringValue:key)!)
}
}
}
配置我们的结构后,解析整个JSON只是一行代码!假设你的JSON是在一个名为json
变量:
let myjson = try JSONDecoder().decode(MyJson.self, from: json.data(using: .utf8)!)
而且你要访问的值是表达得很干脆:
let fav = myjson.responseData[1].unknown[0].isFavourit
因此,所有我需要做的就是让我所有的let
到var
现在它们都是可以设定的,就像你试图做的那样。
(想了解更多的解决方案,请参阅Swift 4 Decodable with keys not known until decoding time。)
请出示一些代码,你试过吗? – 3stud1ant3
你尝试过搜索Stack Overflow吗?你找不到有关管理这类JSON数据的任何事情? – matt
考虑将类别映射到自定义对象(结构或类),名称“isFavourit”意味着“Bool”而不是“Int”。 – vadian