web-dev-qa-db-ja.com

Swift CodableはDictionary <String、Any>をデコードする必要がありますが、代わりに文字列/データが見つかりました

私は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]を除くすべてが機能しています

しかし、コンパイルできないか、「デコードすることが予想されます...」エラーが表示されます。

データなしのシナリオを処理するにはどうすればよいですか?

10
user7219266

_MyObject struct_に小さな変更を加えました。つまり、

1。すべてのpropertiesoptionalsとしてマーク

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値です:

enter image description here

5
PGDev