我的数据结构如下所示。“人类”是一个键的字典,其值是人类的字典:
"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) 我正在尝试实现一个与如何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.
是Codable和CodingKeys在比什么是透过API暴露了更深层次处理?
如果没有,有没有办法在CodingKeys外部实现功能Codable?
对于 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 的实际结果
有没有办法告诉 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 的斗争被记录在了所有的地方,特别是在这里:
我正在使用 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) 我正在解码来自 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) 我知道如何使用rawValue使自定义枚举遵守Codable协议,但是有没有办法使内置本机枚举起作用?
我希望能够存储和检索TextAlignment值,而不必重新发明轮子并创建一些自定义解决方案。
我在任何地方都找不到一个例子!
我需要用大写首字母(又名 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 格式。
我正在绕圈尝试使用可编码结构。我几乎可以让它工作,但最后出现错误。
这是一个简单的例子:
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 处的额外参数
显然嵌套结构没问题。如果我删除:Codable和init(),它func encode()就会按我的预期工作。
这样做的正确方法是什么?
我有这个帐户结构。当我发送“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)