如何从嵌套结构制作 JSON

How to make JSON from nested struct

我有一个嵌套结构:

struct Order: Codable {
    
    let foodList: [FoodList]
    let name: String
    let phone: String
    let email: String
}

struct FoodList: Codable {
    
    let foodName: String
    let foodID: String
    let foodAmount: Int
}

我需要从这个结构中创建 JSON。它必须是这样的:

{
  "name": "Name",
  "phone": "+1 999 999 999 999",
  "email": "email@email.email",
  "foodList": [
    {
      "foodName": "Big Mac",
      "foodID": "115",
      "foodAmount": 2
    },
    {
      "foodName": "Naggets",
      "foodID": "221",
      "foodAmount": 5
    }
  ]
}

但我总是得到这个 JSON )

[
  {
    "email": "Name",
    "phone": "+1 999 999 999 999",
    "foodList": {
      "foodAmount": 2,
      "foodID": "115",
      "foodName": "Big Mac"
    },
    "name": "email@email.email"
  },
  {
    "email": "email@email.email",
    "phone": "+1 999 999 999 999",
    "foodList": {
      "foodAmount": 5,
      "foodID": "221",
      "foodName": "Naggets"
    },
    "name": "Name"
  }
]

在 JSON 中必须是 1 人和所选食物的数组。

我用这段代码 JSON 来构建:

let orderList = [OrderList]()
for index in 0..<subMenuList.count {
    if subMenuList[index].foodList.foodSelectedAmount != 0 {
        
        orderList.append(OrderList(
                            foodList: FoodListOrder(
                                foodName: subMenuList[index].foodList.foodName,
                                foodID: subMenuList[index].foodList.foodID,
                                foodAmount: subMenuList[index].foodList.foodSelectedAmount),
                            name: mainView.nameTextField.text!,
                            phone: mainView.phoneTextField.text!,
                            email: mainView.emailTextField.text!))
    }
let jsonEncoder = JSONEncoder()
do {
    let jsonData = try jsonEncoder.encode(orderList)
    print(String(data: jsonData, encoding: .utf8)!)
} catch {
    print(error)
}

“FOR”块和文本字段中有问题...我认为。每次循环时,我都会从文本字段中附加人的数据。

假设 Order 等于 OrderList 并且 FoodList 等于 FoodListOrder 你必须先创建 FoodList 数组然后创建 ( 单个) Order 对象。

var foodList = [FoodList]()
for item in subMenuList { // don't use an index based loop if you actually don't need the index
    if item.foodList.foodSelectedAmount != 0 {
        foodList.append(FoodList(foodName: item.foodList.foodName,
                                 foodID: item.foodList.foodID,
                                 foodAmount: item.foodList.foodSelectedAmount)
    }
}
let order = Order(foodList: foodList,
                  name: mainView.nameTextField.text!,
                  phone: mainView.phoneTextField.text!,
                  email: mainView.emailTextField.text!)

let jsonEncoder = JSONEncoder()
do {
    let jsonData = try jsonEncoder.encode(order)
    print(String(data: jsonData, encoding: .utf8)!)
} catch {
    print(error)
}