如何使用Decodable解析指定JSON?非字典结构变量定义求助
解析包含嵌套对象的JSON并定义对应变量
嘿,我明白你的困惑了!你提到的aWholeLotOfnames其实就是一个标准的字典/对象结构,可能之前看教程的时候没get到嵌套类型的定义方式。下面我用几种常见语言给你一步步说明怎么处理,尤其是你提到的类似var nameOfVar : [类型]这种强类型定义的场景:
Swift 场景(对应你提到的var类型声明)
因为你提到了用var nameOfVar : [此处应填什么]的写法,大概率是在Swift里处理。这里我们可以用Codable协议来做类型安全的解析,先定义对应嵌套结构的结构体:
// 先定义对应aWholeLotOfnames的嵌套结构体 struct NameGroup: Codable { let name1: String let name2: String } // 再定义整个JSON对应的顶层结构体 struct PersonData: Codable { let name: String let time: String let date: String let differentTimestamps: [String] let aWholeLotOfnames: NameGroup // 这里的类型就是我们刚定义的NameGroup }
接下来是解析逻辑:
// 你的JSON字符串 let jsonString = """ { "name": "Jens", "time": "11.45", "date": "2018:04:17", "differentTimestamps":[""], "aWholeLotOfnames":{ "name1": "Karl", "name2": "pär" } } """ // 把字符串转成Data guard let jsonData = jsonString.data(using: .utf8) else { fatalError("无法将字符串转换为Data") } // 解析JSON do { let parsedData = try JSONDecoder().decode(PersonData.self, from: jsonData) // 访问嵌套对象里的内容 print(parsedData.aWholeLotOfnames.name1) // 输出 "Karl" print(parsedData.aWholeLotOfnames.name2) // 输出 "pär" } catch { print("解析出错:\(error)") }
如果不想用Codable,也可以用手动类型转换的方式:
if let jsonObject = try JSONSerialization.jsonObject(with: jsonData) as? [String: Any], let nameGroup = jsonObject["aWholeLotOfnames"] as? [String: String] { // 这里nameGroup就是[String: String]类型的字典 let karl = nameGroup["name1"] let pär = nameGroup["name2"] }
Python 场景
Python里处理起来更直接,解析后aWholeLotOfnames就是一个普通字典:
import json json_str = '''{ "name": "Jens", "time": "11.45", "date": "2018:04:17", "differentTimestamps":[""], "aWholeLotOfnames":{ "name1": "Karl", "name2": "pär" } }''' # 解析JSON data = json.loads(json_str) # 直接访问嵌套字典 name_group = data["aWholeLotOfnames"] print(name_group["name1"]) # 输出 "Karl" print(name_group["name2"]) # 输出 "pär"
JavaScript/TypeScript 场景
JS里解析后直接是对象,TS可以定义接口做类型约束:
// JavaScript 写法 const jsonStr = `{ "name": "Jens", "time": "11.45", "date": "2018:04:17", "differentTimestamps":[""], "aWholeLotOfnames":{ "name1": "Karl", "name2": "pär" } }`; const data = JSON.parse(jsonStr); // 访问嵌套对象 console.log(data.aWholeLotOfnames.name1); // "Karl" console.log(data.aWholeLotOfnames.name2); // "pär"
// TypeScript 写法(强类型定义) interface NameGroup { name1: string; name2: string; } interface PersonData { name: string; time: string; date: string; differentTimestamps: string[]; aWholeLotOfnames: NameGroup; } const typedData: PersonData = JSON.parse(jsonStr);
总结一下:你困惑的aWholeLotOfnames本质就是一个键值对组成的对象/字典,在强类型语言里(比如Swift、TypeScript),你需要先定义对应的结构体/接口来匹配它的结构;在动态类型语言里(比如Python、JavaScript),直接当作字典/对象访问即可。
内容的提问来源于stack exchange,提问作者J.Doe2
相关产品推荐
相关产品推荐

