如何在json数组结构中添加额外的字段

时间:2018-04-29 08:41:04

标签: arrays json swift alamofire

我需要添加额外的布尔字段то制作可选择的品牌和型号表。 原始的json结构是:

maxscore2 <- function(x, y) {
  w <- which(x == y[1])
  v <- sapply(w, function(i) sum(x[i:(i+(length(y)-1))] == y, na.rm = TRUE))
  max(v)
}

我需要在品牌和型号结构中添加isExpended:Bool = false。所以数组应该如下所示:

    {
        "brands": [
            {
                "id": "19",
                "name": "Audi",
                "sort": "1",
                "num": 1,
                "models": [
                    {
                        "id": "190",
                        "name": "TTS",
                        "num": 1
                    },
                    {
                        "id": "189",
                        "name": "TT",
                        "num": 2
                    },
                    {
                        "id": "188",
                        "name": "V8",
                        "num": 3
                    },
                    {
                        "id": "187",
                        "name": "SQ5",
                        "num": 4
                    }
                ],
......

我的模特:

{
        "brands": [
            {
          --->  "isExpanded": false,
                "id": "19",
                "name": "Audi",
                "sort": "1",
                "num": 1,
                "models": [
                    {
                 --->   "isExpanded": false,
                        "id": "190",
                        "name": "TTS",
                        "num": 1
                    },

让我使用json:

struct auto_data: Decodable {
    var brands: [brands]
    var gearbox: [gearbox]
    var fuel: [fuel]
    var version: String
}

struct brands: Decodable {
    var id: String
    var name: String
    var sort: String
    var num: Int
    var models: [brand_models]
}

struct brand_models: Decodable {
    var id: String
    var name: String
    var num: Int
}

我不想通过正确的结构遍历数组的所有元素并将它们放在另一个元素中。有没有其他方法可以改变数组的结构?

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案是解析您的JSON,然后通过迭代每个品牌来添加预期的新字段。最后,您必须将对象字符串化回JSON。

1. var obj = JSON.parse('{ your json }');      parse object 
2. obj.brands(2)["isExpanded"] = false;        add new propertie
3. JSON.stringify(obj)                         convert back to JSON

答案 1 :(得分:0)

首先,请遵循结构和类名以大写字母开头并且 CamelCased 的命名约定。进一步的名称结构以单数形式。在语言语义方面,您创建了一个BrandModel,而不是一个BrandModels

如果您需要在符合Decodable的结构中添加自定义成员,则必须指定CodingKeys

在大多数情况下,将已解码的struct成员声明为常量(let

就足够了
struct Brand: Decodable {

    private enum CodingKeys : String, CodingKey {
        case id, name, sort, num, models
    }

    var isExpanded = false
    let id: String
    let name: String
    let sort: String
    let num: Int
    let models: [BrandModel]
}

struct BrandModel: Decodable {

    private enum CodingKeys : String, CodingKey {
        case id, name, num
    }

    var isExpanded = false
    let id: String
    let name: String
    let num: Int
}