标签: codable

使用Swift 4嵌套的Codable协议

我正在使用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但我无法使其工作.

我的问题:这是一个编译器错误(它仍然是测试版)或者我做错了什么?

swift4 xcode9 codable

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

如何解码类型依赖于标记的值数组?

我有一个带有一组值的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)

json swift codable

7
推荐指数
2
解决办法
734
查看次数

在动态类型/对象上使用Codable

嗨我有以下结构嵌套在一个更大的结构,从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].

swift swift4 codable

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

Swift 4 Decodable:来自嵌套数组的struct

鉴于以下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对象nodesactors属性中的嵌套容器中检索.

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 swift codable decodable

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

Swift Codable null处理

我有一个使用解析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 ios swift codable decodable

7
推荐指数
2
解决办法
9776
查看次数

Swift Codable多种类型

我尝试解析返回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)

swift codable decodable

7
推荐指数
2
解决办法
2244
查看次数

如何在 Swift 4 中使用 JSONEncoder 对字典进行编码

我想用 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)

swift codable encodable jsonencoder

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

Swift Codable:如何将顶级数据编码到嵌套容器中

我的应用程序使用一个返回 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词典存在于同一词典中。

目标:

  1. 将此 JSON 解码为类/结构。
    • 因为user很常见,我希望它位于顶级类/结构中。
  2. 编码为新格式(例如 plist)。
    • 我需要保留原始结构。(即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)

ios swift codable decodable encodable

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

带有保留字的 Swift Codable

我有一种情况,从 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”不能用作此处的标识符

swift codable

6
推荐指数
2
解决办法
1113
查看次数

如何在 Swift 中使用 Codable 解码具有不同对象的 JSON 数组?

我有一个 JSON,它由一个顶级对象组成,然后是一个由不同 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)

json ios swift codable

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

标签 统计

codable ×10

swift ×9

decodable ×4

json ×4

ios ×3

encodable ×2

swift4 ×2

jsonencoder ×1

xcode9 ×1