将 JSON 数据从 Parse Cloud Code 返回到 Swift 中的可解码结构
Posted
技术标签:
【中文标题】将 JSON 数据从 Parse Cloud Code 返回到 Swift 中的可解码结构【英文标题】:Return JSON data from Parse Cloud Code to a Decodable Struct in Swift 【发布时间】: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")
【参考方案1】:
PFCloud
的部分工作是从云函数响应创建通用集合类型。由于云函数正在响应 JS 对象,PFCloud
应该在调用 callFunction
回调之前传输 JSON 并解析它,而无需应用程序注意到。
所以发布的云代码结果将是一个字典。检查以...
if result is Dictionary<AnyHashable,Any>
print("result is a Dictionary")
要将其转换为 OP 结构,请向其添加一个来自字典的初始化程序...
struct MyDecodableStruct: Decodable
var someBooleanProperty:Bool
var someIntProperty: Int
init(dictionary: [AnyHashable,Any])
self.someBooleanProperty = dictionary["someBooleanProperty"] as? Bool ?? false
self.someIntProperty = dictionary["someIntProperty"] as? Int ?? 0
【讨论】:
以上是关于将 JSON 数据从 Parse Cloud Code 返回到 Swift 中的可解码结构的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 parse.com 云功能 Android 将 Json 对象强制转换为 Float