Swift Codable希望解码Dictionary <String,Any>,但却找到了一个字符串/数据

10 json swift swift4 codable

我一直在使用该Codable协议

这是我的JSON档案:

    {  
   "Adress":[  

   ],
   "Object":[  
      {  
         "next-date":"2017-10-30T11:00:00Z",
         "text-sample":"Some text",
         "image-path":[  
            "photo1.png",
            "photo2.png"
         ],
         "email":"john.doe@test.com",
         "id":"27"
      },
      {  
         "next-date":"2017-10-30T09:00:00Z",
         "text-sample":"Test Test",
         "image-path":[  
            "image1.png"
         ],
         "email":"name.lastename@doe.com",
         "id":"28"
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

我只需要关注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 = ""
    }
}
Run Code Online (Sandbox Code Playgroud)

在以这种方式请求和获取JSON数据后,我从我的服务类调用它:

if let data = response.data {
                let decoder = JSONDecoder()
                let result = try! decoder.decode(Result, from: data)
                dump(result.Object)
            }
Run Code Online (Sandbox Code Playgroud)

一切正常,除了[String]image财产

但它无法编译,或者我得到"预期解码..."错误.

我该如何处理nil/no数据场景?

PGD*_*Dev 6

我对你做了一个小改动MyObject struct,即

1.全部标记propertiesoptionals

2.删除init()(我认为这里没有任何要求init().)

3.使用Result.self的,而不是Resultdecoder.decode(...)方法

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"
    }
}
Run Code Online (Sandbox Code Playgroud)

为了测试上面的内容,我使用了下面的代码,它工作正常.

    let jsonString = """
        {"Adress": [],
        "Object": [{"next-date": "2017-10-30T11:00:00Z",
        "text-sample": "Some text",
        "image-path": ["photo1.png", "photo2.png"],
        "email": "john.doe@test.com",
        "id": "27"},
      {"next-date": "2017-10-30T09:00:00Z",
       "text-sample": "Test Test",
       "image-path": ["image1.png"],
       "email": "name.lastename@doe.com",
       "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)
    }
Run Code Online (Sandbox Code Playgroud)

这是我得到的结果值:

在此输入图像描述

  • @PGDev绝对正确.永远不要相信后端:-) (6认同)
  • ```将所有属性标记为选项``` - 为什么要这样做? (4认同)
  • 因为未确认您将从API获得所有键值对.而不是用空字符串/数组初始化它们,它们更好,它们是零.这就是我为他们使用可选项的原因. (2认同)