我有多个可编码类要转换为JSON字符串。
class MyCodable: NSObject, Codable {
override init() {
}
func encode(to encoder: Encoder) throws {
}
}
class Category: MyCodable {
required init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self);
//... assign values and call super.init
}
override func encode(to encoder: Encoder) throws {
}
var categoyId: Int64;
var categoryName: String;
enum CodingKeys: String, CodingKey {
case categoryId
case categoryName
}
}
class Product: MyCodable {
required init(from decoder: Decoder) throws {
//..assign values and call super.init
}
override func encode(to encoder: Encoder) throws {
}
var productId: Int64;
var categoryId: Int64;
var productName: String;
enum CodingKeys: String, CodingKey {
case productId
case categoryId
case productName
}
}
我有一个用于转换的实用程序类。
class JSONUtil: NSObject {
public static func encode(objects: [MyCodable]) -> String {
var json: String = "";
do {
let encoder = JSONEncoder();
encoder.outputFormatting = .prettyPrinted;
let jsonData = try encoder.encode(objects);
json = String(data: jsonData, encoding: String.Encoding.utf8)!
} catch let convertError { json = "[{error: '" + convertError.localizedDescription + "'}]"; }
return json;
}
public static func toJson(object: MyCodable) -> String {
var objects = [MyCodable]();
objects.append(object);
return encode(objects: objects);
}
}
返回值始终是“[{}”,不管可分支对象数组中有什么。调试时,我可以看到Category对象的值已填充。
由于mycoble没有属性,这就是为什么JSONEncoder不打印类别属性吗?.. 或者为什么不打印类别属性?
我对产品对象也有同样的问题。
目标是避免为我想打印到JSON的每个类定制JSON转换。
最佳答案
您的推理是正确的,mycoable没有属性,因此没有任何可读/可写的内容。实际上,您偶然发现了swift JSON编码器和解码器的一个错误。他们不能很好地处理继承问题。因此,您的产品和类别类变成了匿名的可复制类,没有任何可编码或解码的内容。
看看你的代码,我看不出mycoable类的原因。只需让产品和类别遵守可编码协议。如果您需要能够以相同的方式引用产品和类别的多态性,请定义一个遵循可编码性并使产品和类别遵循您定义的协议的protoocl。在我看来,这是多余的,但是在某些用例中,这是一个合理的解决方案。
关于ios - Swift 4 JSONEncoder返回空的JSON数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53241868/