Как создать вложенную json из кодируемой модели в iOS Swift? - PullRequest
0 голосов
/ 13 января 2020

Я пытался создать json из модели. Первоначально создал модель aadhar и сохранил данные aadhar из API-отклика на модель.

И создал еще одну модель адхар2, передал значение модели адхар в модель адхар2. Но отклики моделей aadhar model 1 и aadhar model 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 model 1 class:

  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
   }
}

Вот код, где я передаю модель 1 адхара в модель 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)

Вот код модели 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",
  "******",
  "******",
  "******"
   ]
  }
 }

Любая помощь высоко ценится пожалуйста ...

1 Ответ

1 голос
/ 14 января 2020

Прежде всего, ваши исходные Codable модели для анализа фактических JSON должны быть такими,

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. Соответствует * От 1020 * до 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...