gpt4 book ai didi

json - 如何在 Swift 中解码具有许多唯一键的嵌套 JSON?

转载 作者:行者123 更新时间:2023-11-28 07:49:25 24 4
gpt4 key购买 nike

我的问题是我可以用来解码具有许多不同键的 JSON 的最佳方法是什么?现在,我正在为每个人创建一个 var。这似乎是低效/硬编码,我有大约 8 个不同的菜单需要解码。

这是我的 JSON:(很长,我知道)

{
"Brunch": {
"BEAR FIT": [
"Savory Tofu, Spinach, Tomato Scramble"
],
"BEAR FUSION": [
"Roasted Red & Gold Beets",
"Baked Ham",
"Parslied Potatoes",
"Roasted Zuchhini Squash Medley",
"Vegan Celebration Roast",
"Steamed Rice",
"Brown Rice"
],
"BEAR NECESSITIES": [
"Rolled Oatmeal",
"Italian Wedding Soup"
],
"BEAR SWEETS": [
"Blueberry Muffin",
"Cranberry Orange Scone",
"Assorted Danish"
],
"BREAKFAST PLATE": [
"Hashbrown Tri Patty",
"Spiced French Toast",
"Breakfast Veggie Patty"
],
"GOLDEN GRILL": [
"Waffle Bar Toppings"
],
"ITALIAN CORNER": [
"Omelet Bar"
],
"PASTAS": [
"Breadsticks",
"Pasta",
"Whole Wheat Pasta",
"Creamy Alfredo Sauce",
"Beef Bolognese Sauce"
],
"SMOOTHIES": [
"Peach Smoothie"
],
"SPECIALTY SALADS": [
"Macaroni Salad"
]
},
"Dinner": {
"BEAR FIT": [
"Vegetable Caribbean Blend",
"Three Bean Chili",
"Brown Rice"
],
"BEAR FUSION": [
"Chicken Vindaloo",
"Chana Masala",
"Brown Rice",
"Steamed Rice"
],
"BEAR NECESSITIES": [
"Garden Vegetable Soup with Tomato",
"Italian Wedding Soup"
],
"BEAR SWEETS": [
"Raspberry Sammie",
"Chocolate Chunk Brownie",
"Pumpkin Pie"
],
"CAL-ZONE": [
"Mushroom & Olive Flatbread",
"Meat Lovers Pizza",
"Pepperoni Pizza"
],
"GOLDEN GRILL": [
"Fish Sandwich",
"Malibu Burger",
"Shoestring Fries"
],
"PASTAS": [
"Breadsticks",
"Pasta",
"Whole Wheat Pasta",
"Creamy Alfredo Sauce",
"Beef Bolognese Sauce"
],
"SPECIALTY SALADS": [
"Macaroni Salad"
],
"THE BIG C": [
"Hawaiian BBQ Pork",
"Blackened Tilapia with Lemon Pepper",
"Teriyaki Tofu",
"Steamed Rice",
"Suateed Cabbage",
"Cinnamon Glazed Carrot"
]
}
}

这是我现在拥有的解析器:

struct WeekendMenu: Decodable {
struct Brunch: Decodable {
var BEAR_FIT: [String]
var BEAR_FUSION: [String]
var BEAR_NECESSITIES: [String]
var BEAR_SWEETS: [String]
var BREAKFAST_PLATE: [String]
var GOLDEN_GRILL: [String]
var ITALIAN_CORNER: [String]
var PASTAS: [String]
var SMOOTHIES: [String]
var SPECIALTY_SALADS: [String]
private enum CodingKeys: String, CodingKey {
case BEAR_FIT = "BEAR FIT"
case BEAR_FUSION = "BEAR FUSION"
case BEAR_NECESSITIES = "BEAR NECESSITIES"
case BEAR_SWEETS = "BEAR SWEETS"
case BREAKFAST_PLATE = "BREAKFAST PLATE"
case GOLDEN_GRILL = "GOLDEN GRILL"
case ITALIAN_CORNER = "ITALIAN CORNER"
case PASTAS = "PASTAS"
case SMOOTHIES = "SMOOTHIES"
case SPECIALTY_SALADS = "SPECIALTY SALADS"
}
}
struct Dinner: Decodable {
//TODO
}
var brunch: String
var dinner: String
private enum CodingKeys: String, CodingKey {
case brunch = "Brunch"
case dinner = "Dinner"
}
}

最佳答案

在这种情况下,我建议将 JSON 解码为字典 [String:[String]]

struct WeekendMenu: Decodable {
private enum CodingKeys : String, CodingKey { case brunch = "Brunch", dinner = "Dinner" }

let brunch: [String:[String]]
let dinner: [String:[String]]
}

枚举字典,对key进行排序,得到相同的顺序

let result = try JSONDecoder().decode(WeekendMenu.self, from: data)
for key in result.brunch.keys.sorted() {
print(key, result.brunch[key]!)
}
for key in result.dinner.keys.sorted() {
print(key, result.dinner[key]!)
}

或者编写自定义初始化器将字典解码为自定义结构 Category,键变为 name,值变为 dishes数组。

struct WeekendMenu: Decodable {
private enum CodingKeys : String, CodingKey { case brunch = "Brunch", dinner = "Dinner" }

let brunch: [Category]
let dinner: [Category]

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let brunch = try container.decode([String:[String]].self, forKey: .brunch)
let brunchKeys = brunch.keys.sorted()
self.brunch = brunchKeys.map { Category(name: $0, dishes: brunch[$0]!) }
let dinner = try container.decode([String:[String]].self, forKey: .dinner)
let dinnerKeys = dinner.keys.sorted()
self.dinner = dinnerKeys.map { Category(name: $0, dishes: dinner[$0]!) }
}
}

struct Category {
let name : String
let dishes : [String]
}

关于json - 如何在 Swift 中解码具有许多唯一键的嵌套 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50093369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com