简体   繁体   English

如何从 iOS Swift 中的可编码模型创建嵌套的 json?

[英]How to create nested json from codable model in iOS Swift?

I have been trying to create json from model.我一直在尝试从模型创建 json。 Initially created aadhar model and stored aadhar data from api response to model.最初创建了 aadhar 模型并将 aadhar 数据从 api 响应存储到模型。

And created another aadhar model2, passed aadhar model value to aadhar model2.并创建了另一个aadhar模型2,将aadhar模型值传递给aadhar模型2。 But aadhar model 1 and aadhar model 2 response differ parameters.但是 aadhar 模型 1 和 aadhar 模型 2 响应不同的参数。

here is my json response value.这是我的 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 model 1 class: 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
   }
}

Here the code where i am passing aadhar model 1 to aadhar model2:这是我将 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)

Here is aadhar model 2:这是 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 output i'm trying to get:我试图获得的 Json 输出:

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

Any help much appreciated pls...任何帮助非常感谢请...

First of all, your initial Codable models to parse the actual JSON should be like,首先,解析实际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)"
    }
}

In the above models,在上述模型中,

1. struct Root contains a computed property formattedModel that will return a model of type AadharModelConverted 1. struct Root包含一个计算属性formattedModel ,它将返回一个AadharModelConverted类型的模型

2. Conform struct DOB to CustomStringConvertible and override description to return the expected String value. 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]
}

You can now parse the JSON data using,您现在可以使用解析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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 How to create a model class and access the values from JSON response using Codable in ios swift? - How to create a model class and access the values from JSON response using Codable in ios swift? Create a model class and access the values from JSON response using Codable in ios swift? - Create a model class and access the values from JSON response using Codable in ios swift? 如何在iOS Swift 3中从模型创建JSON - How to create JSON from Model in ios Swift 3 iOS swift Codable 不适用于 JSON 嵌套数据的 Alamofire? - iOS swift Codable not working with Alamofire for JSON nested data? 如何在iOS Swift Codable中通过API响应通知或打印模型类中缺少的键? - How to notify or print for missing key on model class from API response in iOS Swift Codable? 如何使用 Codable 和 Swift 解析这个嵌套的 JSON? - How do I parse this nested JSON using Codable with Swift? 如何使用 Swift 为 JSON 数据创建 JSON Codable 和 Decodable? - How to create JSON Codable and Decodable for a JSON data using Swift? Swift 4 - 使用Codable协议进行JSON解析(嵌套数据) - Swift 4 - JSON parsing with Codable protocol (nested data) 如何在 iOS swift 的 Codable 方法中使用此响应 - how to use this response in Codable method in iOS swift 使用 Codable (Swift) 从 Json 文件解析 UIColor - Parse UIColor from Json file with Codable (Swift)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM