- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
注意:这个问题我已经看过了-> How do I use custom keys with Swift 4's Decodable protocol?但它没有解释如何编码/解码枚举
这是我想要的结构:
struct MyStruct: Decodable {
let count: PostType
}
enum PostType: Decodable {
case fast(value: Int, value2: Int)
case slow(string: String, string2: String)
}
现在我知道我希望我的结构看起来如何,问题是:
init
函数在 PostType
枚举中应该是什么样子。我使用下面的代码来帮助我快速构建 JSON。
let jsonData = """
{
"count": {
"fast" :
{
"value": 4,
"value2": 5
}
}
}
""".data(using: .utf8)!
// Decoding
do {
let decoder = JSONDecoder()
let response = try decoder.decode(MyStruct.self, from: jsonData)
print(response)
} catch {
print(error)
}
谁能帮我解决这个问题?
Edit1 我的 JSON 看起来像这样
{
"count": {
"fast" :
{
"value": 4,
"value2": 5
}
}
}
init
在 PostType enum
中应该是什么样的?
最佳答案
由于具有关联类型的 enum
不匹配任何 JSON 类型,您需要更多的手工操作并编写自定义映射。
以下代码涵盖三个选项。
首先枚举不能符合Codable
enum PostType {
case fast(value: Int, value2: Int)
case middle(bool: Bool)
case slow(string: String, string2: String)
}
案例 fast
使用一个数组,middle
一个子字典,slow
单独的键/值对。
然后声明MyStruct
结构,采用Codable
并声明type
struct MyStruct : Codable {
var type : PostType
此解决方案需要自定义 key
enum CodingKeys: String, CodingKey {
case value, string, string2, middle
}
encode
方法 switch
es 并创建适当的类型
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
switch type {
case .fast(let value, let value2) :
try container.encode([value, value2], forKey: .value)
case .slow(let string, let string2) :
try container.encode(string, forKey: .string)
try container.encode(string2, forKey: .string2)
case .middle(let bool):
try container.encode(["bool" : bool], forKey: .middle)
}
}
在decode
方法中可以通过传入的key来区分大小写,确保它们是唯一的。
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let allKeys = values.allKeys
if allKeys.contains(.middle) {
let value = try values.decode([String:Bool].self, forKey: .middle)
type = PostType.middle(bool: value["bool"]!)
} else if allKeys.contains(.value) {
let value = try values.decode([Int].self, forKey: .value)
type = PostType.fast(value: value[0], value2: value[1])
} else {
let string = try values.decode(String.self, forKey: .string)
let string2 = try values.decode(String.self, forKey: .string2)
type = PostType.slow(string: string, string2: string2)
}
}
}
虽然有些键是硬编码的,但第一个选项似乎是最合适的。
最后是一个使用它的例子:
let jsonString = "[{\"value\": [2, 6]}, {\"string\" : \"foo\", \"string2\" : \"bar\"}, {\"middle\" : {\"bool\" : true}}]"
let jsonData = jsonString.data(using: .utf8)!
do {
let decoded = try JSONDecoder().decode([MyStruct].self, from: jsonData)
print("decoded:", decoded)
let newEncoded = try JSONEncoder().encode(decoded)
print("re-encoded:", String(data: newEncoded, encoding: .utf8)!)
} catch {
print(error)
}
关于json - 如何使用 Decodable 协议(protocol)将此 JSON 转换为 Swift 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44594459/
我得到了一些有趣的结果,试图辨别使用 Encode::decode("utf8", $var) 之间的区别。和 utf8::decode($var) .我已经发现,在一个变量上多次调用前者最终会导致错
我尝试使用 FlushedInputStream :Android decoder->decode returned false for Bitmap download 但没有任何变化,因为我使用:B
我有一小部分代码: from pyasn1.type import univ from pyasn1.codec.ber import decoder decoder.decode(binary_fi
这个问题在这里已经有了答案: Instantiated optional variable shows as nil in Xcode debugger (2 个答案) 关闭 2 年前。 在 Swi
我在 Playground 中有以下示例代码。如果结果符合 Decodable 协议(protocol),我想解码网络请求的结果。 知道为什么这段代码不起作用吗? protocol APIReques
我正在尝试使用 imagecreatefromwebp() 将 webp 文件转换为 JPEG,但不幸的是,它向我发出警告:警告:imagecreatefromwebp():WebP 解码:无法解码输
我试图覆盖 JSONDecoder 解码数据的方式。 我尝试了以下方法: struct Response : Decodable { init(from decoder: Decoder) t
ACTIVATE_THIS = """ eJx1UsGOnDAMvecrIlYriDRlKvU20h5aaY+teuilGo1QALO4CwlKAjP8fe1QGGalRoLEefbzs+Mk Sb7
我正在尝试使用 swift 4 来解析本地 json 文件: { "success": true, "lastId": null, "hasMore": false,
我的代码有问题。 我正在尝试使用ExtJS和Codeigniter制作上传文件格式。 这是我的下面的代码, Ext.require([ 'Ext.form.field.File',
我有一些遗留代码正在调用 sun.net.www.ParseUtil.decode()。我想避免调用供应商特定的函数,所以我想用其他东西替换调用。 我可以使用 java.net.URLDecoder.
使用 Sonatype Nexus,我仅在访问 /nexus/#admin/support/status 时收到此错误消息. Ext.JSON.decode(): You're trying to d
我正在学习 Elm,让我感到困惑的一件事是“Json.Decode.succeed”。根据docs succeed : a -> Decoder a Ignore the JSON and produ
有什么区别 URLDecoder.decode(String s) 和 URLDecoder.decode(String s, String enc) 我有一个 cookie 值,例如 val=%22
使用 Google Apps 脚本,我想解码 HTML,例如: Some text & text ¢ 存储为: Some text & text ¢ 所以,类似的问题:How t
我正在对带有字幕的视频进行编码,但出现错误“解码的字幕文本中的 UTF-8 无效;可能缺少 -sub_charenc 选项。解码流时出错”,但视频还是编码了。忽略此错误的后果是什么?谷歌搜索显示一个人
我有如下代码: cn_bytes = [157, 188, 156] cn_str = "" clen = len(cn_bytes) count = int(clen / 3) for x in r
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
This script give you a decoded listing from an encoded file. Supports *,je, ,vbe, .asp, .hta, .htm,
telnet客户端响应如何解码 我认为这是一个特定的响应,因为所有思科服务器都有相同的响应.这段文字的名称是什么,我如何解密它 '\xff\xfb\x01\xff\xfb\x03\xff\xfd\x1
我是一名优秀的程序员,十分优秀!