我在下面有一個 JSON 物件,它使用字串、布林值和整數中的所有內容。我目前很難重新創建person_details物件的部分,我認為是因為它在括號中并且有多個值,比如[String: Bool], [String: String]& [String: Int]?
我在底部發布了控制臺上填充的內容,但是任何幫助在其中構建 person_details 部分都會很棒。您將在下面看到,按照我的順序,我正在構建資料。
let testJson = """
{
"household": {
"region": "PA",
"household_size": 1,
"receiving_benefits": [
],
"energy_crisis": false,
"utility_providers": [
"peco"
],
"residence_type": "other",
"property_tax_past_due": false,
"home_needs_repairs": false,
"filed_previous_year_tax_return": false,
"heating_system_needs_repairs": false,
"at_risk_of_homelessness": false,
"received_maximum_benefit": {
"cip": false
},
"person_details": [
{
"age": 18,
"marital_status": "single",
"minimum_employment_over_extended_period": false,
"work_status": "recent_loss",
"pregnant": false,
"attending_school": false,
"disabled": false
}
],
"incomes": [
{
"gross_monthly_amount": 700,
"countable_group": "household",
"year": "current"
},
{
"gross_monthly_amount": 700,
"countable_group": "household",
"year": "previous"
}
],
"assets": [
{
"amount": 1000,
"countable_group": "household"
}
]
}
}
"""
struct Eligibility: Encodable {
let residence: String
let hhmembers: Int
let receivingBen: [String]
let unhoused: Bool
let utilityType: [String]
let residenceType: String
let propertyTax: Bool
let homeRepairs: Bool
let fileLastTax: Bool
let heatRepairs: Bool
let receivingMax: [String: Bool]
enum CodingKeys: String, CodingKey {
case residence = "region"
case hhmembers = "household_size"
case receivingBen = "receiving_benefits"
case unhoused = "at_risk_of_homelessness"
case utilityType = "utility_providers"
case residenceType = "residence_type"
case propertyTax = "property_tax_past_due"
case homeRepairs = "home_needs_repairs"
case fileLastTax = "filed_previous_year_tax_return"
case heatRepairs = "heating_system_needs_repairs"
case receivingMax = "received_maximum_benefit"
}
}
struct PersonDetails: Encodable {
let age: Int
// let marital_status: String
// let minimum_employment_over_extended_period: Bool
// let work_status: String
// let pregnant: Bool
// let attending_school: Bool
// let disabled: Bool
enum CodingKeys: String, CodingKey {
case age = "age"
// case marital_status = "marital_status"
// case minimum_employment_over_extended_period = "minimum_employment_over_extended_period"
// case work_status = "work_status"
// case pregnant = "pregnant"
// case attending_school = "attending_school"
// case disabled = "disabled"
}
}
我相信我缺少的是在里面let order =,見下文:
struct Order: Encodable {
let household: Eligibility
let person_details: PersonDetails
}
let order = Order(household: Eligibility(residence: "PA", hhmembers: 1, receivingBen: [], unhoused: false, utilityType: ["Peco"], residenceType: "other", propertyTax: false, homeRepairs: false, fileLastTax: false, heatRepairs: false, receivingMax: ["cip": false]), person_details: PersonDetails(age: 19))
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let orderJsonData = try! encoder.encode(order)
print(String(data: orderJsonData, encoding: .utf8)!)
控制臺內部顯示“家庭”之外的 person_details,但我需要家庭物件內部的 person_details,因為上面的完整 JSON 物件顯示在問題的頂部(也請注意方括號)。下面的控制臺:
{
"household" : {
"region" : "PA",
"residence_type" : "other",
"at_risk_of_homelessness" : false,
"property_tax_past_due" : false,
"utility_providers" : [
"Peco"
],
"home_needs_repairs" : false,
"filed_previous_year_tax_return" : false,
"household_size" : 1,
"receiving_benefits" : [
],
"heating_system_needs_repairs" : false,
"received_maximum_benefit" : {
"cip" : false
}
},
"person_details" : {
"age" : 19
}
}
uj5u.com熱心網友回復:
從 JSON 轉換為 swift 時,您的資料層次結構錯誤。
它應該是...
struct Order: Codable {
let household: Household
}
struct Household: Codable {
let personDetails: [Person]
}
struct Person: Codable {
let age: Int
let maritalStatus: String
let minimumEmploymentOverExtendedPeriod: Bool
let workStatus: String
let pregnant: Bool
let attendingSchool: Bool
let disabled: Bool
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let order = try! decoder.decode(Order.self, from: Data(testJson.utf8))
回傳
人(年齡:18,maritalStatus:“單身”,minimumEmploymentOverExtendedPeriod:假,作業狀態:“recent_loss”,懷孕:假,就讀學校:假,禁用:假)]
另外值得指出的是使用.keyDecodingStrategy來簡化從蛇盒的轉換。這節省了定義CodingKeys. 顯然,這只適用于您樂于保持命名相同的情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/438922.html
