主要是我的用例是使用字典创建对象:例如
struct Person: Codable { let name: String }
let dictionary = ["name": "Bob"]
let person = Person(from: dictionary)
Run Code Online (Sandbox Code Playgroud)
我想避免编写自定义实现,并希望尽可能高效.
根据JSON标准RFC 7159,这是有效的json:
22
Run Code Online (Sandbox Code Playgroud)
如何使用swift4的可解码将其解码为Int?这不起作用
let twentyTwo = try? JSONDecoder().decode(Int.self, from: "22".data(using: .utf8)!)
Run Code Online (Sandbox Code Playgroud) 我一直在使用该Codable协议
这是我的JSON档案:
{
"Adress":[
],
"Object":[
{
"next-date":"2017-10-30T11:00:00Z",
"text-sample":"Some text",
"image-path":[
"photo1.png",
"photo2.png"
],
"email":"john.doe@test.com",
"id":"27"
},
{
"next-date":"2017-10-30T09:00:00Z",
"text-sample":"Test Test",
"image-path":[
"image1.png"
],
"email":"name.lastename@doe.com",
"id":"28"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我只需要关注Object数组,"image-path"数组可以包含0,1或2个字符串.
所以这是我的实现:
struct Result: Codable {
let Object: [MyObject]
}
struct MyObject: Codable {
let date: String
let text: String
let image: [String]
let email: String
let id: String
enum CodingKeys: String, CodingKey {
case date = "next-date"
case text = "text-sample"
case image = "image-path"
case …Run Code Online (Sandbox Code Playgroud) 我想JSONEncoder使用struct符合Encodable协议的Swift编码可选字段.
默认设置是JSONEncoder使用encodeIfPresent方法,这意味着nil从Json中排除的值.
如何在不编写自定义encode(to encoder: Encoder)函数的情况下为单个属性覆盖此属性,我必须在其中实现所有属性的编码(如本文在"自定义编码"下建议的那样)?
例:
struct MyStruct: Encodable {
let id: Int
let date: Date?
}
let myStruct = MyStruct(id: 10, date: nil)
let jsonData = try JSONEncoder().encode(myStruct)
print(String(data: jsonData, encoding: .utf8)!) // {"id":10}
Run Code Online (Sandbox Code Playgroud) 使用Swift4,iOS11.1,Xcode9.1,
使用新的Swift4 typealiase"Codable"适用于JSON解码(如此处或此处或许多其他贡献中所述).但是,在XML解析方面,我找不到任何有关此"Codable"协议是否也可用于XML解码的信息.
我尝试使用XMLParser(可以在下面的代码中看到).但我没有使用"Codable"协议来简化XML解析过程.我怎么必须完全使用Codable协议来简化XML解析?
// the Fetching of the XML-data (excert shown here with a simple dataTask) :
let myTask = session.dataTask(with: myRequest) { (data, response, error) in
// check for error
guard error == nil else {
completionHandler(nil, error!)
return
}
// make sure we got data in the response
guard let responseData = data else {
let error = XMLFetchError.objectSerialization(reason: "No data in response")
completionHandler(nil, error)
return
}
// the responseData is XML !!!!!!!!!!!!!! …Run Code Online (Sandbox Code Playgroud) 我遵循了按预期工作的 Codable 结构
struct VideoAlbum: Codable {
let id, image: String?
let video, mediaType: JSONNull?
let type, deleted, createdOn: String?
let modifiedOn: JSONNull?
enum CodingKeys: String, CodingKey {
case id, image, video
case mediaType = "media_type"
case type, deleted
case createdOn = "created_on"
case modifiedOn = "modified_on"
}
}
Run Code Online (Sandbox Code Playgroud)
// MARK: 编码/解码助手
class JSONNull: Codable {
public init() {}
public required init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if !container.decodeNil() {
throw DecodingError.typeMismatch(JSONNull.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong …Run Code Online (Sandbox Code Playgroud) 我需要获取一个用于解析JSON的结构的泛型变量
但是我得到的错误 类型'BaseJsonModel'不符合协议'Codable
下面是我的结构
struct BaseJsonStruct<T>: Codable {
let info: String
let data: T
}
Run Code Online (Sandbox Code Playgroud)
错误: - 类型'BaseJsonModel'不符合协议'Codable'
我正在研究混合匹配的iOS源代码。我为快速数据模型类实现了可编码,这减少了编写解析器逻辑的负担。我试图使我的目标c类符合可编码协议,这又引发了一个错误“找不到'Codable'的协议声明”。有什么办法可以将此快速协议用于目标c类吗?还是有其他目标c api提供与Codable相同的功能?这个想法是使快速和客观c类之间的解析逻辑相同。
是否可以将 Swift JSON 编码器配置为使用结构体属性的排序顺序作为 JSON 输出中字典键的排序顺序?默认情况下,它使用一些任意(但看似不是随机)的顺序,例如......
struct Example: Codable {
let id: Int
let name: String
let createdAt: Date
let comments: [String]
}
Run Code Online (Sandbox Code Playgroud)
... 结果是 ...
"example" : {
"id" : 1,
"name" : "Test",
"comments" : [
"Comment 1",
"Comment 2"
],
"createdAt" : 549539643.25327206
}
Run Code Online (Sandbox Code Playgroud)
我知道从语义上来说顺序并不重要,但我想保留它以用于调试目的。
我有一个 Codable 类:
class Task: Codable {
var name: String
}
Run Code Online (Sandbox Code Playgroud)
当我尝试实例化它时:
let newTask = Task()
allTasks.append(newTask)
Run Code Online (Sandbox Code Playgroud)
它给了我错误:
调用中缺少参数“from”的参数
我想要的只是将一个新对象(newTask)插入到一个数组中。什么是最简单的方法来做到这一点?
codable ×10
swift ×8
swift4 ×4
ios ×3
json ×3
decode ×1
encoding ×1
objective-c ×1
xml-parsing ×1