我有多个可编码类要转换为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/

10-11 04:22