私はCodable
プロトコルを使用しています
これが私のJSON
ファイルです:
{
"Adress":[
],
"Object":[
{
"next-date":"2017-10-30T11:00:00Z",
"text-sample":"Some text",
"image-path":[
"photo1.png",
"photo2.png"
],
"email":"[email protected]",
"id":"27"
},
{
"next-date":"2017-10-30T09:00:00Z",
"text-sample":"Test Test",
"image-path":[
"image1.png"
],
"email":"[email protected]",
"id":"28"
}
]
}
Object配列にのみ注目する必要があり、「image-path」配列には0、1、または2つの文字列を含めることができます。
これが私の実装です:
struct Result: Codable {
let Object: [MyObject]
}
struct MyObject: Codable {
let date: String
let text: String
let image: [String]
let email: String
let id: String
enum CodingKeys: String, CodingKey {
case date = "next-date"
case text = "text-sample"
case image = "image-path"
case email = "email"
case id = "id"
}
init() {
self.date = ""
self.text = ""
self.image = []
self.email = ""
self.id = ""
}
}
この方法でJSONデータを要求および取得した後、サービスクラスから呼び出します。
if let data = response.data {
let decoder = JSONDecoder()
let result = try! decoder.decode(Result, from: data)
dump(result.Object)
}
image
プロパティの[String]
を除くすべてが機能しています
しかし、コンパイルできないか、「デコードすることが予想されます...」エラーが表示されます。
データなしのシナリオを処理するにはどうすればよいですか?
_MyObject struct
_に小さな変更を加えました。つまり、
1。すべてのproperties
をoptionals
としてマーク
2。init()
を削除(ここにinit()
の要件はないと思う。)
3。decoder.decode(...)
メソッドでResult
の代わりに_Result.self
_を使用
_struct MyObject: Codable
{
let date: String?
let text: String?
let image: [String]?
let email: String?
let id: String?
enum CodingKeys: String, CodingKey
{
case date = "next-date"
case text = "text-sample"
case image = "image-path"
case email = "email"
case id = "id"
}
}
_
上記をテストするために、以下のコードを使用しましたが、うまく機能しています。
_ let jsonString = """
{"Adress": [],
"Object": [{"next-date": "2017-10-30T11:00:00Z",
"text-sample": "Some text",
"image-path": ["photo1.png", "photo2.png"],
"email": "[email protected]",
"id": "27"},
{"next-date": "2017-10-30T09:00:00Z",
"text-sample": "Test Test",
"image-path": ["image1.png"],
"email": "[email protected]",
"id": "28"}
]
}
"""
if let data = jsonString.data(using: .utf8)
{
let decoder = JSONDecoder()
let result = try? decoder.decode(Result.self, from: data) //Use Result.self here
print(result)
}
_
これは私が得ているresult値です: