Swift使用JSONSerialization.data时发生JSON写入错误,类型无效



我有一个带有自定义类型元素的数组。这是类型:

public class RequestElemDataBody: Codable {
public var name: String
public var value: String
public init(name: String, value: String) {
self.name = name
self.value = value
}
}

这就是我声明数组的方式:

var elementsInForm = [RequestElemDataBody]()

我使用一个函数将这个数组转换为Data,然后转换为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)
}

执行时,我收到以下错误消息:

***由于未捕获的异常"NSInvalidArgumentException"而终止应用程序,原因:"JSON写入(Data.RequestElemDataBody(中的类型无效">

我不知道我的自定义类型出了什么问题,因为它是可编码的。

如何使用函数解析数组而不引发错误?

序列化Codable时应使用JSONEncoder

文档页面中的示例:

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."
}
*/

您的方法的问题是尝试对整个数组进行编码。但是您的可编码对象目前不是数组。

尝试将单个元素传递给方法,并返回字符串以在外部使用它;

func json(from element: RequestElemDataBody) -> String {
...
}

如前所述,顶级对象可以是Array或Dictionary,所有对象都可以是NSString、NSNumber、NSArray、NSDictionary或NSNull的实例。。在您的情况下,它们是自定义对象的实例。

因此,您可以尝试先将对象转换为字典,然后使用JSONSerialization

要转换为字典,您可以在可编码上创建一个扩展

extension Encodable {
var dict : [String: Any]? {
guard let data = try? JSONEncoder().encode(self) else { return nil }
guard let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String:Any] else { return nil }
return json
}
}

在调用函数时,您可以使用ArrayName.compactMap({$0.dict}(

也可以使用ObjectMapper库。

参考:如何将Swift对象转换为字典

最新更新