将 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 Cloud Android

无法使用 parse.com 云功能 Android 将 Json 对象强制转换为 Float

response.error不是Parse Cloud Code中的函数

使用 Parse Cloud Code 从数组中删除对象

Parse Cloud 函数失败并出现错误 141

JSON.parse()