I have multiple Codeable classes that I want to convert to JSON strings.
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
}
}
I have a utility class that I am using for the conversion.
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);
}
}
The return value is always "[{}]" no matter what is inside the array of MyCodable objects. While debugging, I can see the values of the Category object are populated.
Since MyCodable has no properties, is that why the JSONEncoder does not print out the Category properties?.. Or why doesn't it print the Category properties?
I am having the same issue with the Product object.
The goal is to avoid having to customize the JSON conversion for every class I want to print to JSON.
Your mistake is that you're trying to use inheritance instead of generics. Your
JSONUtil
class should be look like this.I'm not sure why you're creating classes inheriting from
NSObject
. You may be stuck in the old Objective-C ways Prefer to usestruct
overclass
, unless you always need the object to be copied by reference.