我正在使用Swift 4和Codable一点点,并且遇到了一些具有嵌套协议的场景,这些协议都符合Codable.
简化示例如下所示:
protocol CodableSomething: Codable {}
protocol CodableAnotherThing: Codable {
var something: CodableSomething { get }
}
struct Model: CodableAnotherThing {
var something: CodableSomething
}
Run Code Online (Sandbox Code Playgroud)
此代码使用Xcode 9 Beta 5进行构建错误:
现在,我没想到这些错误,因为我理解编译器会自动生成对这些协议的一致性,实际上,我甚至无法在没有构建错误的情况下手动实现此一致性.我也尝试了几种不同的方法来解决这种嵌套模型结构的使用,Codable但我无法使其工作.
我的问题:这是一个编译器错误(它仍然是测试版)或者我做错了什么?
我有一个带有一组值的JSON:
[
{ "tag": "Foo", … },
{ "tag": "Bar", … },
{ "tag": "Baz", … },
]
Run Code Online (Sandbox Code Playgroud)
我想将这个数组解码为一个structs 数组,其中特定类型取决于标记:
protocol SomeCommonType {}
struct Foo: Decodable, SomeCommonType { … }
struct Bar: Decodable, SomeCommonType { … }
struct Baz: Decodable, SomeCommonType { … }
let values = try JSONDecoder().decode([SomeCommonType].self, from: …)
Run Code Online (Sandbox Code Playgroud)
我怎么做?目前我有这个有点丑陋的包装:
struct DecodingWrapper: Decodable {
let value: SomeCommonType
public init(from decoder: Decoder) throws {
let c = try decoder.singleValueContainer()
if let decoded = try? c.decode(Foo.self) {
value …Run Code Online (Sandbox Code Playgroud) 嗨我有以下结构嵌套在一个更大的结构,从api调用返回,但我无法设法编码/解码这部分.我遇到的问题是customKey和customValue都是动态的.
{
"current" : "a value"
"hash" : "some value"
"values": {
"customkey": "customValue",
"customKey": "customValue"
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了类似的东西var values: [String:String]但显然不起作用,因为它实际上并不是一个数组[String:String].
鉴于以下JSON文档,我想创建一个struct包含四个属性:filmCount(Int),year(Int),category(String)和actor(Actor数组).
{
"filmCount": 5,
"year": 2018,
"category": "Other",
"actors":{
"nodes":[
{
"actor":{
"id":0,
"name":"Daniel Craig"
}
},
{
"actor":{
"id":1,
"name":"Naomie Harris"
}
},
{
"actor":{
"id":2,
"name":"Rowan Atkinson"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
PlacerholderData是一个存储三个主要属性和actor列表的结构,这些属性应该从JSON对象nodes的actors属性中的嵌套容器中检索.
PlacerholderData:
struct PlaceholderData: Codable {
let filmCount: Int
let year: Int
let category: String
let actors: [Actor]
}
Run Code Online (Sandbox Code Playgroud)
Actor.swift:
struct Actor: Codable {
let id: Int
let name: String
} …Run Code Online (Sandbox Code Playgroud) 我有一个使用解析JSON的结构Codable.
struct Student: Codable {
let name: String?
let amount: Double?
let adress: String?
}
Run Code Online (Sandbox Code Playgroud)
现在,如果金额值为空,则JSON解析失败.
那么我应该手动处理结构中存在的所有Int和空的情况吗?DoubleStudent
将String自动处理作为null 的值.
我尝试解析返回json对象的api。我的问题是,在以下示例中,某些键有时是字符串,有时是类似键“ Value”的对象:
[
{
"Description": null,
"Group": "Beskrivning av enheten",
"GroupDescription": null,
"Id": "Description",
"Name": "Mer om enheten",
"Value": "Det finns möjlighet till parkering på gatorna runt om, men det är kantstenar och ganska branta backar för att komma upp till lekplatsen.\r\n\r\nUtanför själva lekplatsen finns en gungställning med en plan omväg in. Alla lekredskap står i sandytor, det finns många kanter. Runt hela lekplatsen går ett staket med öppningar i olika riktningar."
},
{
"Description": null,
"Group": "Bilder och film", …Run Code Online (Sandbox Code Playgroud) 我想用 JSONEncoder 将字典编码为 json。它看起来像一个请求,接收一个字典作为参数并将其编码为 json 作为 http 正文。代码如下所示:
let dict = ["name": "abcde"]
protocol Request {
var params: [String: Encodable] { get set }
func encode<T>(_ value: T) throws -> Data where T : Encodable
}
extension Request {
func encode<T>(_ value: T) throws -> Data where T : Encodable {
return try JSONEncoder().encode(value)
}
var body: Data? {
if let encoded = try? self.encode(self.params) {
return encoded
}
return nil
}
}
struct BaseRequest: Request {
var params: [String …Run Code Online (Sandbox Code Playgroud) 我的应用程序使用一个返回 JSON 的服务器,如下所示:
{
"result":"OK",
"data":{
// Common to all URLs
"user": {
"name":"John Smith" // ETC...
},
// Different for each URL
"data_for_this_url":0
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,特定于 URL 的信息与通用user词典存在于同一词典中。
目标:
user很常见,我希望它位于顶级类/结构中。data从顶级user信息和子对象的信息重新创建字典)问题:
重新编码数据时,我无法将user字典(来自顶级对象)和特定于 URL 的数据(来自子对象)写入编码器。
要么user覆盖其他数据,要么其他数据覆盖user. 我不知道如何将它们结合起来。
这是我到目前为止所拥有的:
// MARK: - Common User
struct User: Codable {
var name: String?
}
// MARK: - Abstract Response
struct ApiResponse<DataType: Codable>: Codable …Run Code Online (Sandbox Code Playgroud) 我有一种情况,从 API 返回的 JSON 有一个名为 extension 的字段,它是 Swift 中的保留字。当我尝试使用它时,我的编码器爆炸了。
我已经搜索了过去两个小时,但似乎找不到任何解决方案。
有没有人遇到过这个:
public struct PhoneNumber: Codable {
var phoneNumber: String
var extension: String
var isPrimary: Bool
var usageType: Int
}
Run Code Online (Sandbox Code Playgroud)
关键字“extension”不能用作此处的标识符
我有一个 JSON,它由一个顶级对象组成,然后是一个由不同 JSON 对象组成的数组。我想用最少的结构和没有可选变量来解码这个 json。如果我可以实现,我还想设计一个结构,通过只编写其相关结构来处理所有数组对象。
我会尽量简化这个例子
正如您在图像中看到的,“Id”、“Token”、“ServicePublicKey”都是不同的 JSON 对象。我的整个后端都以这种 JSON 架构返回。我想要实现的是一个结构作为包装器和结构(Id、ServicePublicKey、Token 等)。最后,当有来自 JSON 的新类型时,我只需要编写相关的结构并在包装器中添加一些代码。
我的问题是:如何在没有任何可选变量的情况下解析这个 JSON?
我如何尝试解析它:
struct Initialization: Decodable {
var error: BunqError? //TODO: Change this type to a right one
var id: Int?
var publicKey: String?
var token: Token?
enum CodingKeys: String, CodingKey {
case error = "Error"
case data = "Response"
case Id = "Id"
case id = "id"
case ServerPublicKey = "ServerPublicKey"
case Token = "Token"
}
init(from decoder: Decoder) throws {
let …Run Code Online (Sandbox Code Playgroud)