[英]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.