You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:24:48