簡體   English   中英

如何從 iOS Swift 中的可編碼模型創建嵌套的 json?

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

我一直在嘗試從模型創建 json。 最初創建了 aadhar 模型並將 aadhar 數據從 api 響應存儲到模型。

並創建了另一個aadhar模型2,將aadhar模型值傳遞給aadhar模型2。 但是 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",
  "******",
  "******",
  "******"
   ]
  }
 }

任何幫助非常感謝請...

首先,解析實際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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM