【发布时间】:2018-08-21 17:55:37
【问题描述】:
我希望从 Swift 应用程序运行 Cloud-Code 函数并接收一个对象作为响应。 Parse 的响应对象是如下定义的标准 JSON 对象,而不是 Parse 存储的对象。本质上,我希望得到一个自定义对象来定义云函数的执行结果,而不是存储在数据库中的对象。
我正在努力将 Swift 方面的 CloudCode 响应解码为遵循 Decodable 协议的自定义对象。
示例云代码
Parse.Cloud.define("MyCloudFunc", function(request, response) {
var results = {
"someBooleanProperty": true,
"someIntProperty": 1,
};
response.success(results);
}
示例 Swift 代码
PFCloud.callFunction(inBackground: "MyCloudFunc", withParameters: []) { (result, error) in
// Printing `result` at this point shows what appears to be a JSON object.
guard let data = result as? Data else { return }
// Whatever type `result` actually is cannot be cast as Data, so we never make it past here.
guard let response = try? JSONDecoder().decode(MyDecodableStruct, from: data) else { return }
// DO SOMETHING WITH THE RESULT
}
可解码结构
struct MyDecodableStruct: Decodable {
var someBooleanProperty:Bool
var someIntProperty: Int
}
问题
如何从 Parse Cloud Code 获取响应并最终得到 MyDecodableStruct 类型的解码对象?
更新
正如 cmets/answers 中所建议的,Parse 正在返回一个字典。我已经能够使用以下内容进行所有工作;但是,我觉得有比双重转换更好的方法。
PFCloud.callFunction(inBackground: "MyCloudFunc", withParameters: []) { (result, error) in
guard let jsonString = result as? String else { return }
guard let data = jsonString.data(using: String.Encoding.utf8) else { return }
guard let response = try? JSONDecoder().decode(MyDecodableStruct.self, from: data) else { return }
// DO SOMETHING WITH RESULT.
}
我是否忽略了一种从 Dictionary 直接转换为 Data 而不在中间进行 JSON 转换的方法?
【问题讨论】:
-
你能确认你真的得到一个 JSON 字符串吗?我的期望(基于显示的云代码)是 PFCloud.callFunction 的
result将是字典。检查if result is Dictionary<AnyHashable,Any> { print("result is a Dictionary") }
标签: json swift parse-server parse-cloud-code decodable