簡體   English   中英

在響應Swift Codable中解析純json字符串值

[英]Parse plain json string value inside a response swift codable

我想解析此回復。 除圖像外,其他所有內容均已解析。 我以字符串形式接收它,但隨后無法將其轉換為字典。 這是我的模型。

struct PropertyList: Decodable {

let result: Property?
let success: Bool = false

struct Property: Decodable {
    let name: String?
    let description: String?
    let propertyType: PropertyType
    let latitude, longitude: String

    let images: String?
    let areaSize:Int?
    let threeSixtyView: String?
    let threeDModel: String?

    enum CodingKeys: String, CodingKey {
        case name
        case propertyDescription = "description"
        case propertyType, latitude, longitude
        case threeDModel = "threeDModel"
        case images = "images"
    }
}
}


struct PropertyType: Codable {
let id: Int
let name, propertyTypeDescription: String

enum CodingKeys: String, CodingKey {
    case id, name
    case propertyTypeDescription = "description"
}
}

API響應:

        "name": "Al Deyar",
        "description": "Al Deyar Villa",
        "propertyType": {
            "id": 709415277471,
            "name": "villa",
            "description": "villa"
        },
        "latitude": "1",
        "longitude": "2",
        "viewOfWater": null,
        "threeDModel": "https://viewer.archilogic.com/?sceneId=80d4b3bb-98de-4279-a867-633bf67c6e72&s=m2fss0p3slst",
        "images": "[{\"id\": 1, \"image\":\"https://neigborhood-images.s3.amazonaws.com/property/1BEEA0B6-A2B1-4D5E-837B-9C2B00F46EE4_2048x2048.jpg\"},\n{\"id\": 2, \"image\":\"https://neigborhood-images.s3.amazonaws.com/property/984D2D29-2448-4B68-827F-EC912AB9AF14_2048x2048.jpg\"},\n{\"id\": 3, \"image\":\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-_0002_Layer_11_2048x2048.jpg\"},\n{\"id\": 4, \"image\":\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-_0002_Layer_10_ad2d92e2-3740-4d1d-8e9c-ed41cf89c3b2_2048x2048.jpg\"},\n{\"id\": 5, \"image\":\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-furniture_0001_Layer_21_2048x2048.jpg\"},\n{\"id\": 6, \"image\":\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-furniture_0044_Layer_5_2048x2048.jpg\"},\n{\"id\": 7, \"image\":\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-furniture_0042_Layer_3_2048x2048.jpg\"}]"

> Blockquote

我的模型的值已更新

在此處輸入圖片說明

試試下面的代碼:

更新您的json:

let json = """
{
"name": "Al Deyar",
"description": "Al Deyar Villa",
"propertyType": {
    "id": 709415277471,
    "name": "villa",
    "description": "villa"
},
"latitude": "1",
"longitude": "2",
"viewOfWater": null,
"threeDModel":"https://viewer.archilogic.com/?sceneId=80d4b3bb-98de-4279-a867-633bf67c6e72&s=m2fss0p3slst",
"images": [
{"id": 1, "image": "https://neigborhood-images.s3.amazonaws.com/property/1BEEA0B6-A2B1-4D5E-837B-9C2B00F46EE4_2048x2048.jpg"},
{"id": 2, "image": "https://neigborhood-images.s3.amazonaws.com/property/984D2D29-2448-4B68-827F-EC912AB9AF14_2048x2048.jpg"},
{"id": 3, "image": "https://neigborhood-images.s3.amazonaws.com/property/EBARZA-_0002_Layer_11_2048x2048.jpg"},
{"id": 4, "image": "https://neigborhood-images.s3.amazonaws.com/property/EBARZA-_0002_Layer_10_ad2d92e2-3740-4d1d-8e9c-ed41cf89c3b2_2048x2048.jpg"},
{"id": 5, "image": "https://neigborhood-images.s3.amazonaws.com/property/EBARZA-furniture_0001_Layer_21_2048x2048.jpg"},
{"id": 6, "image": "https://neigborhood-images.s3.amazonaws.com/property/EBARZA-furniture_0044_Layer_5_2048x2048.jpg"},
{"id": 7, "image": "https://neigborhood-images.s3.amazonaws.com/property/EBARZA-furniture_0042_Layer_3_2048x2048.jpg"}
]
}
"""

更新您的可編碼類:

struct Property : Codable {

    let descriptionField : String?
    let images : [Images]?
    let latitude : String?
    let longitude : String?
    let name : String?
    let propertyType : PropertyType?
    let threeDModel : String?
    let viewOfWater : String?

    enum CodingKeys: String, CodingKey {
        case descriptionField = "description"
        case images = "images"
        case latitude = "latitude"
        case longitude = "longitude"
        case name = "name"
        case propertyType = "propertyType"
        case threeDModel = "threeDModel"
        case viewOfWater = "viewOfWater"
    }
}


struct PropertyType : Codable {

    let descriptionField : String?
    let id : Int?
    let name : String?

    enum CodingKeys: String, CodingKey {
        case descriptionField = "description"
        case id = "id"
        case name = "name"
    }
}


struct Images : Codable {
    let id : Int?
    let image : String?
}




if let jsonData = json.data(using: .utf8) {
    let decoder = JSONDecoder()

    do {
        let jsonModel = try decoder.decode(Property.self, from: jsonData)
        print(jsonModel)
    } catch {
        print("Error = \(error)")
    }
}

images是一個嵌套的JSON字符串,必須單獨對其進行解碼。

一種解決方案是使用singleValueContainer將包含嵌套JSON字符串的值聲明為struct( ImageJSON ),然后在第二層對該字符串進行解碼。

我忽略了不在JSON中的屬性

let json = """
{
"success" : true,
"result" : {
    "name": "Al Deyar",
    "description": "Al Deyar Villa",
    "propertyType": {
        "id": 709415277471,
        "name": "villa",
        "description": "villa"
    },
    "latitude": "1",
    "longitude": "2",
    "viewOfWater": null,
    "threeDModel": "https://viewer.archilogic.com/?sceneId=80d4b3bb-98de-4279-a867-633bf67c6e72&s=m2fss0p3slst",
    "images":"[{\\"id\\": 1, \\"image\\":\\"https://neigborhood-images.s3.amazonaws.com/property/1BEEA0B6-A2B1-4D5E-837B-9C2B00F46EE4_2048x2048.jpg\\"},{\\"id\\": 2,\\"image\\":\\"https://neigborhood-images.s3.amazonaws.com/property/984D2D29-2448-4B68-827F-EC912AB9AF14_2048x2048.jpg\\"},{\\"id\\": 3,\\"image\\":\\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-_0002_Layer_11_2048x2048.jpg\\"},{\\"id\\": 4,\\"image\\":\\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-_0002_Layer_10_ad2d92e2-3740-4d1d-8e9c-ed41cf89c3b2_2048x2048.jpg\\"},{\\"id\\": 5,\\"image\\":\\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-furniture_0001_Layer_21_2048x2048.jpg\\"},{\\"id\\": 6,\\"image\\":\\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-furniture_0044_Layer_5_2048x2048.jpg\\"},{\\"id\\": 7,\\"image\\":\\"https://neigborhood-images.s3.amazonaws.com/property/EBARZA-furniture_0042_Layer_3_2048x2048.jpg\\"}]"
    }
}
"""

struct Response : Decodable {
    let result: Property
    let success: Bool
}

struct Property: Decodable {
    let name: String
    let description: String
    let propertyType: PropertyType
    let latitude, longitude: String

    let images: ImageJSON
    let threeDModel: URL
}

struct PropertyType: Codable {
    let id: Int
    let name, description: String
}

struct Image : Decodable {
    let id : Int
    let image : URL
}

struct ImageJSON : Decodable {
    let images : [Image]

    init(from decoder : Decoder) throws {
        let container = try decoder.singleValueContainer()
        let imageJSONString = try container.decode(String.self)
        let imageJSONData = Data(imageJSONString.utf8)
        images = try JSONDecoder().decode([Image].self, from: imageJSONData)
    }
}

let data = Data(json.utf8)
do {
    let decoder = JSONDecoder()
    let response = try decoder.decode(Response.self, from: data)
    let images = response.result.images.images
    print(images)
} catch {
    print(error)
}

如下創建圖像類型,

struct PropertyImage: Decodable {
    var id: Int
    var image: String?
}

現在,從images字符串中獲取datadecode屬性圖像array ,如下所示,

if let data = property.images.data(using: .utf8) {
    do {
        let images = try JSONDecoder().decode([PropertyImage].self, from: data)
        images.forEach { image in
           print(image.id)
           print(image.image)
         }

    } catch {
        print(error)
    }
}

暫無
暫無

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

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