标签: codable

在 Swift 4 中将字典解码为数组

我的数据结构如下所示。“人类”是一个键的字典,其值是人类的字典:

  "humans" : {
    "abc123" : {
      "name" : "Vince",
      "pets" : [ {
        "animal" : "dog",
        "name" : "Clifford"
      }, {
        "animal" : "fish",
        "name" : "Nemo"
      } ]
    },
    "xyz789" : {
      "name" : "Jack"
    }
  }
Run Code Online (Sandbox Code Playgroud)

所以我的 Swift 结构看起来像这样来匹配它:

struct Human: Codable {
    var name: String!
    var pets: [Pet]?
}

struct Pet: Codable {
    var name: String!
    var animal: Animal!
}

enum Animal: String, Codable {
    case cat
    case dog
    case fish
}
Run Code Online (Sandbox Code Playgroud)

我尝试像这样解码(使用CodableFirebase库):

let …
Run Code Online (Sandbox Code Playgroud)

firebase firebase-realtime-database swift4 codable

1
推荐指数
1
解决办法
3250
查看次数

Codable 和 CodingKeys

我正在尝试实现一个与如何Codable使用CodingKeys枚举具有类似功能的协议。

使用Codableand CodingKeys,如果您没有在CodingKeys枚举中为Codable对象的每个属性实现 case ,则会导致编译器错误,指出该对象不符合协议。

我查看了文档,唯一能找到的与Codable( Encodableand Decodable) 协议相关的是实现func encode(to encoder: Encoder)init(from decoder: Decoder)功能的要求。

我得到的最接近的是定义一个协议如下:

protocol TestProtocol {
    associatedType Keys: CodingKey
}
Run Code Online (Sandbox Code Playgroud)

这要求实现者具有Keys符合的属性CodingKey,但它并不强制要求对所有属性都有一个案例。此外,您不能Keys像使用Codable.

CodableCodingKeys在比什么是透过API暴露了更深层次处理?

如果没有,有没有办法在CodingKeys外部实现功能Codable

swift codable decodable encodable

1
推荐指数
1
解决办法
1573
查看次数

如何使用可编码打印 alamofire 响应的结果

对于 codable 新手,我尝试使用 codable 为 alamofire 创建一个类,并尝试发出 api 请求。我收到一些 Swift.DecodingError.typeMismatch 错误,并且由于我的模型类而发现了它。现在我需要的是在解码之前以 JSON(String) 格式打印 alamofire 响应,以便我可以识别 typeMismatch

static func performRequest<T:Decodable>(route:APIRouter, decoder: JSONDecoder = JSONDecoder(), completion:@escaping (Result<T,Error>)->Void) -> DataRequest {

    return AF.request(route)
        .responseDecodable (decoder: decoder){ (response: DataResponse<T>) in
            print(response.result)
            completion(response.result)
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要一些代码来打印 alamofire 的实际结果

ios alamofire codable swift5

1
推荐指数
1
解决办法
1884
查看次数

如何在不损失精度的情况下解码 NSDecimalNumber?

有没有办法告诉 JSONDecoder 将传入的小数转换为字符串?

 public struct Transaction: Decodable
 {
    public let total: NSDecimalNumber?


    enum CodingKeys: String, CodingKey {
        case total = "AMOUNT"

    }

    public init(from decoder: Decoder) throws
    {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        let total = try values.decode(Decimal.self, forKey: .total)
        self.total = NSDecimalNumber(decimal: total);
    }

 }
Run Code Online (Sandbox Code Playgroud)

考虑当 AMOUNT 类似于 397289527598234759823475455622342424358363514.42 时会发生什么

我想使用我拥有的代码,我会得到 nonConformingFloatDecodingStrategy 异常而无法从中恢复或失去精度。

围绕愚蠢的 swift Decimal 的斗争被记录在了所有的地方,特别是在这里:

使 NSDecimalNumber 可编码

nsdecimalnumber swift codable jsondecoder

1
推荐指数
1
解决办法
266
查看次数

使用 iOS 和 Swift 访问深度嵌套的 json 数据的最简单方法是什么?

我正在使用 Swift 5.1,并且有一个深度嵌套的 json 文件,我只想访问 json 文件中的一些元素并忽略其余数据。例如,我只想要下面 json 字符串中数组中的“artistName”和“releaseDate”值。如果我使用嵌套的可解码结构,我不想需要声明每个键名称只是为了获取这两个值的数组。

\n\n
\n{"feed":{"title":"Coming Soon","id":"https://rss.itunes.apple.com/api/v1/us/apple-music/coming-soon/all/10/explicit.json","author":{"name":"iTunes Store","uri":"http://wwww.apple.com/us/itunes/"},"links":[{"self":"https://rss.itunes.apple.com/api/v1/us/apple-music/coming-soon/all/10/explicit.json"},{"alternate":"https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewRoom?fcId=1396220241\\u0026app=music"}],"copyright":"Copyright \xc2\xa9 2018 Apple Inc. All rights reserved.","country":"us","icon":"http://itunes.apple.com/favicon.ico","updated":"2019-12-04T01:48:22.000-08:00",\n\n    "results":[{"artistName":"Stormzy","id":"1487951013","releaseDate":"2019-12-13","name":"Heavy Is The Head","kind":"album","copyright":"\xe2\x84\x97 2019 Hashtag Merky Music Limited under exclusive license to Atlantic Records UK, a division of Warner Music UK Limited.","artistId":"394865154","contentAdvisoryRating":"Explicit","artistUrl":"https://music.apple.com/us/artist/stormzy/394865154?app=music","artworkUrl100":"https://is5-ssl.mzstatic.com/image/thumb/Music123/v4/3c/a8/7c/3ca87c13-bffa-3ebd-eec6-68ea78ab556d/190295403003.jpg/200x200bb.png","genres":[{"genreId":"18","name":"Hip-Hop/Rap","url":"https://itunes.apple.com/us/genre/id18"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/heavy-is-the-head/1487951013?app=music"},{"artistName":"Camila Cabello","id":"1487577356","releaseDate":"2019-12-06","name":"Romance","kind":"album","copyright":"\xe2\x84\x97 2019 Simco Ltd. under exclusive license to Epic Records, a division of Sony Music Entertainment","artistId":"935727853","contentAdvisoryRating":"Explicit","artistUrl":"https://music.apple.com/us/artist/camila-cabello/935727853?app=music","artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music113/v4/fa/89/c7/fa89c706-fecc-2ece-cfc2-661c42807fbd/886448121220.jpg/200x200bb.png","genres":[{"genreId":"14","name":"Pop","url":"https://itunes.apple.com/us/genre/id14"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/romance/1487577356?app=music"},{"artistName":"Harry Styles","id":"1485802965","releaseDate":"2019-12-13","name":"Fine Line","kind":"album","copyright":"\xe2\x84\x97 2019 Erskine Records Limited, under exclusive license to Columbia Records, a Division of Sony Music Entertainment","artistId":"471260289","artistUrl":"https://music.apple.com/us/artist/harry-styles/471260289?app=music","artworkUrl100":"https://is4-ssl.mzstatic.com/image/thumb/Music113/v4/72/89/85/728985d1-9484-7b71-1ea8-0f0654f7dc16/886448022213.jpg/200x200bb.png","genres":[{"genreId":"14","name":"Pop","url":"https://itunes.apple.com/us/genre/id14"},{"genreId":"34","name":"Music","url":"https://itunes.apple.com/us/genre/id34"}],"url":"https://music.apple.com/us/album/fine-line/1485802965?app=music"},{"artistName":"Grimes","id":"1487294744","releaseDate":"2020-02-21","name":"Miss Anthropocene","kind":"album","copyright":"\xe2\x84\x97 2020 4AD …
Run Code Online (Sandbox Code Playgroud)

json ios swift codable decodable

1
推荐指数
1
解决办法
574
查看次数

Swift.DecodingError.Context

我正在解码来自 URL 响应的 JSON(解码器)字符串,如下所示,并在解码过程中得到以下错误消息:

错误:

typeMismatch(Swift.String, Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "tags", intValue: nil), _JSONKey(stringValue: "Index 0") , intValue: 0)], debugDescription: "预期解码字符串,但找到了一个数字。",underlyingError: nil))

结构:

struct Wordpress: Codable {
    let id: Int?
    let date: String?
    let date_gmt: String?
    let guid: GUID?
    let modified: String?
    let modified_gmt: String?
    let slug: String?
    let status: String?
    let type: String?
    let link: String?
    let title: Title?
    let content: Content?
    let excerpt: Excerpt?
    let author: Int?
    let featured_media: Int?
    let comment_status: String?
    let ping_status: …
Run Code Online (Sandbox Code Playgroud)

swift codable

1
推荐指数
1
解决办法
668
查看次数

如何在 SwiftUI 中使 TextAlignment 可编码?

我知道如何使用rawValue使自定义枚举遵守Codable协议,但是有没有办法使内置本机枚举起作用?

我希望能够存储和检索TextAlignment值,而不必重新发明轮子并创建一些自定义解决方案。

我在任何地方都找不到一个例子!

enums ios swift codable swiftui

1
推荐指数
1
解决办法
292
查看次数

使用 JSONDecoder 解码 PascalCase JSON

我需要用大写首字母(又名 PascalCase 或 UppperCamelCase)解码 JSON,如下所示:

{
    "Title": "example",
    "Items": [
      "hello",
      "world"
    ]
}
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个符合以下条件的模型Codable

struct Model: Codable {
    let title: String
    let items: [String]
}
Run Code Online (Sandbox Code Playgroud)

JSONDecoder会引发错误,因为情况不同。

Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "title", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"title\", intValue: nil) (\"title\").", underlyingError: nil))
Run Code Online (Sandbox Code Playgroud)

我想将模型的属性保留在驼峰命名法中,但我无法更改 JSON 格式。

json uppercase swift codable decodable

1
推荐指数
1
解决办法
1112
查看次数

如何创建可编码结构的实例?

我正在绕圈尝试使用可编码结构。我几乎可以让它工作,但最后出现错误。

这是一个简单的例子:

struct Stuff: Codable {
    var title: String = ""
    var code: Int = 0
    struct Item {
        var name: String
        var value: Int
    }
    var items: [Item] = []
    init(from decoder: Decoder) throws { }
    func encode(to encoder: Encoder) throws { }
}

var items: [Stuff.Item] = []

items.append(Stuff.Item(name: "Apple", value: 1))
items.append(Stuff.Item(name: "banana", value: 2))

var stuff = Stuff(title: "test", code: 23, items: items)
Run Code Online (Sandbox Code Playgroud)

在最后一行我收到错误

位置 #1、#2、#3 处的额外参数

显然嵌套结构没问题。如果我删除:Codableinit(),它func encode()就会按我的预期工作。

这样做的正确方法是什么?

struct swift codable

1
推荐指数
1
解决办法
2910
查看次数

忽略 swift Codable 中的以下属性?

我有这个帐户结构。当我发送“POST”端点并使用它们将成功解码返回给 swift 对象时,我想忽略以下属性环境和 Id 编码到 JSON 对象

更新我有这个错误属性类型'[环境]'与其包装类型'SkipEncode'的'wrappedValue'属性不匹配

struct Account: Codable {
    let accountID, displayName, managedByID, id: String
    let environments: [Environment]
    let contacts: [Contact]

    enum CodingKeys: String, CodingKey {
        case accountID
        case displayName
        case managedID
        case id
        case environments
        case contacts
    }
}
Run Code Online (Sandbox Code Playgroud)

json swift urlsession codable

1
推荐指数
2
解决办法
1001
查看次数