簡體   English   中英

Swift 5:從我的變量中使用 Codable / Struct 創建 JSON

[英]Swift 5 : Create JSON with Codable / Struct from my variables

我想創建一個 Codable 結構來保存用戶配置文件中的數據 假設 ios 用戶填寫了一個表格,其中包含他的姓名、姓氏、地址,並放置了他的照片 (UIImage)),並且該用戶具有唯一 ID。 我的 JSON 就像

{"Unique_ID" :"1234556778", 
    {"Name":"John",
     "Last Name" : "Doe",
     "adress" :
        {"street": "21 jump street",
         "country" : "USA"}
     } 
}

我嘗試創建 Codable但我認為它不是最優的,你能給我一些優化它的提示或者告訴我這樣做是否錯誤嗎?

        struct User_Profile: Codable {
        let Unique_ID : String
        let Data_Of_User : User_Profile_Data
         }

  struct User_Profile_Data: Codable {
        let name : String
        let last_name: String
        let adress : User_Adress_Data
       }

  struct User_Adress_Data: Codable {
        let street : String
        let country: String
       }



override func viewDidLoad() {
        super.viewDidLoad()
        
        let usernametest = "John"
     
        let b = User_Adress_Data(street: "21 jump street", country: "USA")
        let c = User_Profile_Data(name: usernametest, last_name: "Doe", adress: b)
        let d = User_Profile(Unique_ID: "123456", Data_Of_User: c)
        }

之后,我想用 Haneke swift( https://github.com/Haneke/HanekeSwift ) 或 Datacache ( https://github.com/huynguyencong/DataCache ) 緩存它我如何緩存我的 Codables? (例如,我沒有使用 Haneke 查看任何“為 json 設置緩存”)

最后,我想在使用 SwiftyJSON 獲取后使用它:( https://github.com/SwiftyJSON/SwiftyJSON ),我不知道我的 Codables 是否足夠可讀。

感謝您的想法/評論!

由於您可以完全控制自己的結構並且不涉及任何集合,因此我建議將所有內容都放在一個結構中,而不是將其分散在許多不同的結構中:

struct UserProfile: Codable{
    var id: String
    var name: String
    var lastname: String
    var street: String
    var country: String
}

關於緩存。 正如您可以將此結構標記為Codable一樣,它可以很容易地作為Data存儲在Userdefaults中。 Userdefaults上的這個擴展應該允許您以類型安全的方式訪問UserProfile

extension UserDefaults{
    var userProfile: UserProfile?{
        get{
            guard let data = data(forKey: "userProfile") else{
                return nil
            }
            
            return try? JSONDecoder().decode(UserProfile.self, from: data)
        }
        set{
            set(try? JSONEncoder().encode(newValue), forKey: "userProfile")
        }
    }
}

使用示例:

//Write
UserDefaults.standard.userProfile = UserProfile(id: UUID().uuidString, name: "First", lastname: "Last", street: "nowhere", country: "atlantis")
//Read
let profile = UserDefaults.standard.userProfile

編輯:編輯示例:

因為這是一個結構,所以每次發生變化時它都會被復制。 所以讀取 var 中的值。 修改它並保存到defaultStore。

var profile = UserDefaults.standard.userProfile
profile?.country = "newCountry"
UserDefaults.standard.userProfile = profile

您提供的示例無效 JSON。它看起來像是某種字典和數組的混合體。

所以讓我們做一些調整:

{
  "Unique_ID": "1234556778",
  "Data_of_User": {
    "First_Name": "John",
    "Last_Name": "Doe",
    "Address": {
      "Street": "21 jump street",
      "Country": "USA"
    }
  }
}

然后你可以創建如下所示的結構:

struct UserProfile: Codable {
    let uniqueID: String
    let userData: UserData
    
    enum CodingKeys: String, CodingKey {
        case uniqueID = "Unique_ID"
        case userData = "Data_of_User"
    }
}

struct UserData: Codable {
    let firstName: String
    let lastName: String
    let address: Address
    
    enum CodingKeys: String, CodingKey {
        case firstName = "First_Name"
        case lastName = "Last_Name"
        case address = "Address"
    }
}

struct Address: Codable {
    let street: String
    let country: String
    
    enum CodingKeys: String, CodingKey {
        case street = "Street"
        case country = "Country"
    }
}

Codable 要求結構中的屬性名稱與 json 對應的屬性名稱相匹配。 在您的User_Profile_Data結構中,您有name而 json 包含"Name"並且您有last_name ,其中 json 包含"Last Name"

解決此問題的一種方法是向您的結構添加一個CodingKeys枚舉,告訴它如何 map 屬性。 所以在你的User_Profile_Data結構中我會添加:

enum CodingKeys: String, CodingKey { case name = "Name" case last_name = "Last Name" case adress }

暫無
暫無

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

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