Как кодировать вложенные массивы с помощью JSONEncoder - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь кодировать четыре разных массива в формат json с помощью JSONEncoder, но не могу конвертировать массивы.Так что, пожалуйста, помогите мне.Я использую swift 4, xcode 9 для iOS 11.

Мои массивы:

var timeCart //dynamic data as string
var nameCart //dynamic data as string, ex. ["myNameOne", "myNameTwo", ...]
var quantityCart //dynamic data as Int, ex. [2, 3, 5, ...]
var priceCart //dynamic data as Int, ex. [82, 73, 65, ...]

Мои структуры:

struct OrderDetailJSON: Encodable {
    let allOrder: [AllOrder]
    let TaxDetials: TaxDetail

    struct AllOrder: Encodable {
        let date_time: String
        let item: String
        let name: String
        let price: String
    }

    struct TaxDetail: Encodable {
        let tax_per: String
        let tax_name: String
    }
}

Я пытаюсь его кодироватьвот так, внутри табличного представления

let orderDetailsJSON = OrderDetailJSON(allOrder: [.init(date_time: "\(quantityCart[indexPath.row])", item: "\(quantityCart[indexPath.row])", name: "\(nameCart[indexPath.row])", price: "\(priceCart[indexPath.row])")], TaxDetials: .init(tax_per: defaults.string(forKey: "STORE_TAX")!, tax_name: defaults.string(forKey: "STORE_TAX_NAME")!))
        do {
            let jsonData = try JSONEncoder().encode(orderDetailsJSON)
            let jsonString = String(data: jsonData, encoding: .utf8)
            print("order_details :" + jsonString!)
        }catch{

        }

вывод, который я получаю:

order_details: {
  "TaxDetials": {
    "tax_per": "5",
    "tax_name": "CGST & SGST"
  },
  "allOrder": [
    {
      "date_time": "2",
      "name": "Manchurian",
      "item": "2",
      "price": "87"
    }
  ]
}order_details: {
  "TaxDetials": {
    "tax_per": "5",
    "tax_name": "CGST & SGST"
  },
  "allOrder": [
    {
      "date_time": "3",
      "name": "Paneer Tikka",
      "item": "3",
      "price": "150"
    }
  ]
}order_details: {
  "TaxDetials": {
    "tax_per": "5",
    "tax_name": "CGST & SGST"
  },
  "allOrder": [
    {
      "date_time": "2",
      "name": "snacks",
      "item": "2",
      "price": "54"
    }
  ]
}

и вывод, который я ожидаю:

order_details: {
  "TaxDetials": {
    "tax_per": "5",
    "tax_name": "CGST & SGST"
  },
  "allOrder": [
    {
      "date_time": "2",
      "name": "Manchurian",
      "item": "2",
      "price": "87"
    },
    {
      "date_time": "3",
      "name": "Paneer Tikka",
      "item": "3",
      "price": "150"
    },
    {
      "date_time": "2",
      "name": "snacks",
      "item": "2",
      "price": "54"
    }
  ]
}

1 Ответ

0 голосов
/ 25 мая 2018

Нет ничего плохого в ваших объявлениях структуры (кроме того факта, что вы должны соответствовать соглашению об именах Swift, которое является lowerCamelCase для имен переменных - taxPer вместо tax_per и т. Д., И что ваши свойства не имеют имениспользовать правильные формы множественного числа / единственного числа).

Проблема в том, что вы определяете экземпляр OrderDetailJSON для каждой ячейки табличного представления, в то время как кажется, что ваш TaxDetails должен быть одинаковым для всех ячеек втаблица, и вы на самом деле хотите создать один OrderDetailJSON экземпляр, свойство массива которого allOrder содержит один AllOrder экземпляр для каждой ячейки табличного представления.Вам нужно изменить свойство allOrder на mutable, чтобы это работало.

class YourTableViewController: UITableViewController {
    var orderDetails: OrderDetailJSON
    ...
    // You might need to use a different tableView function depending on your exact needs
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        orderDetails.allOrder[indexPath.row] = AllOrder(date_time: "\(quantityCart[indexPath.row])", item: "\(quantityCart[indexPath.row])", name: "\(nameCart[indexPath.row])", price: "\(priceCart[indexPath.row])")
    }
}

Необходимо убедиться, что orderDetails инициализирован с правильным TaxDetails и что вы предварительно распределили егоколичество элементов до allOrder столько ячеек табличного представления, сколько у вас будет.Вам нужно преобразовать orderDetails в JSON только после того, как все ячейки заполнены информацией, вам не нужно делать это для каждой ячейки.

...