【问题标题】:How to create nested json from codable model in iOS Swift?如何从 iOS Swift 中的可编码模型创建嵌套 json?
【发布时间】:2020-04-30 03:16:29
【问题描述】:

我一直在尝试从模型创建 json。最初创建 aadhar 模型并将 aadhar 数据从 api 响应存储到模型。

并创建了另一个 aadhar model2,将 aadhar 模型值传递给 aadhar model2。但是 aadhar 模型 1 和 aadhar 模型 2 响应参数不同。

这是我的 json 响应值。

{
"apiVersion": "1.3.1",
"id": "387a65ba6e51cd1d18bef58cc60c47b751830532ea10465106a54d600d5042f9",
"data": {
    "meta": {
        "confidence_ocr_mean": 0.95869,
        "confidence_ocr_var": 0.00912,
        "confidence_ocr_skew": -4.06817,
        "confidence_ocr_kurt": 17.71878,
        "model_confidence": 1.0,
        "image_resolution": "7427 * 2623",
        "checksum_status": true
    },
    "info": {
        "name": [
            "V",
            "Parameswaran"
        ],
        "date_of_birth": {
            "date": 28,
            "month": 12,
            "year": 1989
        },
        "aadhaar_id": "4682********",
        "gender": "male",
        "address": [
            "Unique Identification Authority of India C/O",
            "316 / 87",
            "*******",
            "*******",
            "***********",
            "*******",
            "*****"
        ],
        "state": null,
        "pincode": null
       }
    }
  }

AAdhar 模型 1 类:

  import Foundation

 public struct aadharModels: Codable {

let id: String
let info: infoAadharClass

  enum CodingKeys: String, CodingKey {
//        case links = "_links"
        case info = "info"
        case id
    }
 }

 struct infoAadharClass: Codable {

let aadhaar_id, gender: String
let name: [String]
let dateofbirth: DobClass
let address: [String]

enum CodingKeys: String, CodingKey {

    case aadhaar_id, gender
    case name
    case address
    case dateofbirth = "date_of_birth"
}
}

struct DobClass: Codable {

 let date, month, year: String

   enum CodingKeys: String, CodingKey {

       case date, month, year
   }
}

这是我将 aadhar 模型 1 传递给 aadhar 模型 2 的代码:

  let aadharID = data.info.aadhaar_id
                     let aadharB_Day = data.info.dateofbirth.date
                     let aadharB_month = data.info.dateofbirth.month
                     let aadharB_year = data.info.dateofbirth.year
                     let aadharGender = data.info.gender
                     let aadharName = data.info.name
                     let aadharAddress = data.info.address
                     print("aadhar address", aadharAddress)

  let aadharDate = aadharB_Day+"/"+aadharB_month+"/"+aadharB_year

                     var aadhar_c = AadharModelConverted(aadharNumber: aadharID, dob: aadharDate, gender: aadharGender, name: aadharAddress, address: aadharAddress)

     //convert to json
      let jsonData = try! JSONEncoder().encode(aadhar_c)
                        let jsonString = String(data: jsonData, encoding: .utf8)!
                        print("json object using pan model",jsonString)

这是 aadhar 模型 2:

        import Foundation

 public struct AadharModelConverted: Codable {

var aadharNumber: String?
var dob: String?
var gender: String?
var name: [String]?
var address: addressSubclass_c

enum CodingKeys: String, CodingKey {

    case aadharNumber, dob, gender, name
    case address = "address"
  }

 }

struct addressSubclass_c: Codable {

var values: [String]

 }

我想要得到的 JSON 输出:

 {
 "aadharNumber": "60**********",
 "dob": "0/0/1994",
 "gender": "male",
 "name": "VipinAgrawal",
 "address": {
 "values": [
  "S/O Mukesh Agrawal",
  "ho",
  "no - 67",
  "******",
  "******",
  "******"
   ]
  }
 }

任何帮助都非常感谢...

【问题讨论】:

    标签: ios arrays json swift nested


    【解决方案1】:

    首先,解析实际 JSON 的初始 Codable 模型应该是这样的,

    struct Root: Codable {
        let id: String
        let data: AadharData
    
        var formattedModel: AadharModelConverted {
            var model = AadharModelConverted()
            model.aadharNumber = self.data.info.aadhaarId
            model.dob = String(describing: self.data.info.dateOfBirth)
            model.gender = self.data.info.gender
            model.name = self.data.info.name
            model.address?.values = self.data.info.address
            return model
        }
    }
    
    struct AadharData: Codable {
        let info: AadharInfo
    }
    
    struct AadharInfo: Codable {
        let aadhaarId, gender: String
        let name: [String]
        let dateOfBirth: DOB
        let address: [String]
    }
    
    struct DOB: Codable, CustomStringConvertible {
        let date, month, year: Int
    
        var description: String {
            return "\(date)/\(month)/\(year)"
        }
    }
    

    在上述模型中,

    1. struct Root 包含一个计算属性 formattedModel,它将返回一个 AadharModelConverted 类型的模型

    2. 使struct DOB 符合CustomStringConvertible 并覆盖description 以返回预期的String 值。

    struct AadharModelConverted: Codable {
        var aadharNumber: String?
        var dob: String?
        var gender: String?
        var name: [String]?
        var address: Address?
    }
    
    struct Address: Codable {
        var values: [String]
    }
    

    您现在可以使用,

    解析 JSON 数据
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let model = try decoder.decode(Root.self, from: data)
    
    let formattedModel = model.formattedModel
    
    let data = try JSONEncoder().encode(formattedModel)
    let str = String(data: data, encoding: String.Encoding.utf8)
    print(str)
    

    【讨论】:

      猜你喜欢
      • 2017-08-29
      • 2016-11-25
      • 2022-01-16
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2015-01-27
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多