swiftmoya

Swift Invalid type in JSON write error using JSONSerialization.data


I have an array with elements of a custom type. Here is the type :

public class RequestElemDataBody: Codable {
    public var name: String
    public var value: String

    public init(name: String, value: String) {
        self.name = name
        self.value = value
    }
}

This is how I declare my array :

var elementsInForm = [RequestElemDataBody]()

I use a function to convert this array to Data then to String :

func json(from object: [Any]) -> String? {
    guard let data = try? JSONSerialization.data(withJSONObject: object, options: []) else {
        return nil
    }
    return String(data: data, encoding: String.Encoding.utf8)
}

When executing I get this error message :

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (Data.RequestElemDataBody)'

I don't know what is wrong with my custom type since it is Codable.

How can I parse my array with my function without it throwing an error ?


Solution

  • You should use JSONEncoder when serializing Codable.

    The example from the documentation page:

    struct GroceryProduct: Codable {
        var name: String
        var points: Int
        var description: String?
    }
    
    let pear = GroceryProduct(name: "Pear", points: 250, description: "A ripe pear.")
    
    let encoder = JSONEncoder()
    encoder.outputFormatting = .prettyPrinted
    
    let data = try encoder.encode(pear)
    print(String(data: data, encoding: .utf8)!)
    
    /* Prints:
     {
       "name" : "Pear",
       "points" : 250,
       "description" : "A ripe pear."
     }
    */