- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样的情况,服务器向我发送了一个模型,我知道一些键的类型和名称,但不知道其他键的类型和名称。但是,用户可以根据自己的意愿编辑其他键值对。
例子:
{ "a": "B",
"b": 42,
"__customKey1": "customVal1",
"__customKey2": [41, 42],
"__customKey3": {"z":"x"}
}
所以我最终想要的是一个模型,其中包含一些声明的属性和一些填充到 Dictionary<String, Any>
中的值。 ,例如
struct MyStruct {
var a: String?
var b: Int?
var dict: Dictionary<String,Any>
}
我试过类似的方法:
public struct CodingKeysX: CodingKey {
public var intValue: Int?
public var stringValue: String
public init?(intValue: Int) { self.intValue = intValue; self.stringValue = "\(intValue)" }
public init?(stringValue: String) { self.stringValue = stringValue }
static func make(key: String) -> CodingKeysX {
return CodingKeysX(stringValue: key)!
}
}
init(from decoder: Decoder) throws {
let co = try! decoder.container(keyedBy: CodingKeysX.self)
let container = try decoder.container(keyedBy: CodingKeys.self)
self.a = try container.decode(String?.self, forKey: .a)
self.b = try container.decode(Int?.self, forKey: .b)
let allDeclaredKeys = container.allKeys.map({ $0.stringValue })
self.dict = Dictionary<String, Any>()
for key in co.allKeys.filter({ !allDeclaredKeys.contains($0.stringValue) }) {
self.dict[key.stringValue] = try? co.decodeIfPresent(Any.self, forKey: key)
}
}
但是我得到以下编译时错误:
Protocol type 'Any' cannot conform to 'Decodable' because only concrete types can conform to protocols
似乎也使用 JSONDecoder
我无法引用原始 Data
给我们NSJSONSerialization
.所以我想,我可以反过来做,我首先使用旧技术初始化字典,然后使用 JSONDecoder
初始化模型。并用传入数据的东西替换 init,但感觉不对,因为我们会有效地反序列化两次:/
最佳答案
我不同意你应该将其解析为 [String: Any]
。 JSON 中只有少数几种合法的值类型。这与 Any
相去甚远。
相反,您的起点 IMO 将是 generic JSON decoder .解码为 JSON
枚举。
let value = try JSONDecoder().decode(JSON.self, from: json)
==> Optional(["__customKey1": "customVal1", "b": 42, "a": "B", "__customKey2": [41, 42], "__customKey3": ["z": "x"]])
value["a"]?.stringValue // Note value is a JSON, not a Dictionary
==> Optional("B")
使用它,为了解决您的特定问题,您可以做这样的事情(非常接近您现有的解码器):
struct MyStruct {
var a: String?
var b: Int?
var dict: [String: JSON] // JSON values, not Any values
}
extension MyStruct: Decodable {
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: JSON.Key.self)
let knownKeys = [JSON.Key("a"), JSON.Key("b")]
// Unload the known keys. There's no need for these to be Optional unless
// they really are optional (and nil is different than ""). The point,
// is you can do any "normal" validation you want here and throw on error.
self.a = try container.decodeIfPresent(String.self, forKey: JSON.Key("a"))
self.b = try container.decodeIfPresent(Int.self, forKey: JSON.Key("b"))
// Unload the rest into your dictionary
self.dict = [:]
for key in container.allKeys where !knownKeys.contains(key) {
self.dict[key.stringValue] = try container.decode(JSON.self, forKey: key)
}
}
}
let ms = try JSONDecoder().decode(MyStruct.self, from: json)
=> MyStruct(a: Optional("B"), b: Optional(42),
dict: ["__customKey1": "customVal1",
"__customKey2": [41, 42],
"__customKey3": {"z": "x"}])
ms.dict["__customKey1"]?.stringValue // Optional("customVal1")
关于Swift4 Decodable - 将一半的键解码为字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57351147/
我得到了一些有趣的结果,试图辨别使用 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
我是一名优秀的程序员,十分优秀!