如何在json数组结构中添加附加字段

Posted

技术标签:

【中文标题】如何在json数组结构中添加附加字段【英文标题】:how to add additional field in json array structure 【发布时间】:2018-04-29 08:41:03 【问题描述】:

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

    
        "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
                    
                ],
......

我需要在品牌和模型结构中添加 isExpended: Bool = false。所以数组应该是这样的:


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

我的模特:

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

获取我使用的 json:

func get_data (order_type: String, localization: String, version: String, completion: @escaping ([brands]?) -> Void) 
    let encodedBodyParams = "order_type=\(order_type)&localization=\(localization)&version=\(version)"
    let url = URL(string: "http://skat.az/forapi/api/get_data.php")
    Alamofire.request(url!, method: .post, parameters: [:], encoding: encodedBodyParams, headers: [:]).responseJSON  (response) in
        if response.result.isSuccess 
            do 
                let result = response.data
                let data = try JSONDecoder().decode(auto_data.self, from: result!)

                completion(data.brands)
             catch 
                print("Error: \(error)")
            
            print("models ОК!")
         else 
            print("error response: \(String(describing: response.error))")
            completion(nil, nil, nil)
        
    

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

【问题讨论】:

【参考方案1】:

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

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

在大多数情况下,将解码后的结构成员声明为常量就足够了 (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

【讨论】:

感谢您的澄清和决定。效果很好)) @vadian 切换isExpanded 初始值并使用UserDefaults 保存它。当我稍后解码保存的数据时,它会将所有isExpanded 返回为false。如何解决?跨度> @Dilan 因为isExpanded 不在CodingKeys 中,所以它不会被保存。具体解决方案取决于上下文【参考方案2】:

一个简单的解决方案是解析您的 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

【讨论】:

以上是关于如何在json数组结构中添加附加字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有数组的情况下附加到 JSON?

Swift 4 可解码 - 附加变量

使用 Spark 访问嵌套在结构中的 json 数组

将新的子文档附加到主结构中的数组

使用 postgres 9.4 将 JSON 元素附加到数组

如何快速将 json 附加到我的数组中