将JSON转换为Swift Object或JSON字典

时间:2018-09-19 01:46:44

标签: json node.js swift

在我的Swift代码中,我对我的node.js服务器做了一个URLRequest

URLSession.shared.dataTask(with: checkoutRequest, completionHandler: {
    [weak self] (data: Data?, response: URLResponse?, error: Error?) in
    guard let data = data,
        let dataString = String(data: data, encoding: String.Encoding.utf8) else {
            return
    }

    // Help me!!!

}).resume()

node.js通过使用Braintree Payments结帐API处理交易来处理此请求。

checkoutProcessor.processCheckout(amount, nonce, (error, result) => {
    // Checkout callback
    if (error) {
        res.write(error.message)
        res.end()
    } else if (result) {
        console.log(result)
        res.write(JSON.stringify(result))
        res.end()
    }
})

通常,如果API请求失败(例如,无信号),它将返回error,但是如果事务通过,则它将返回result

result的类型取决于金融交易是成功还是失败:

例如,result代表成功交易:

Object {transaction: Transaction, success: true}

result用于失败的交易:

ErrorResponse {errors: ValidationErrorsCollection, params: Object, message: "Insufficient Funds", transaction: Transaction, success: false}

dataString看起来像这样:

{\“交易\”:{\“ id \”:\“ m7mj3qd7 \”,\“状态\”:\“ submitted_for_settlement \”,\“类型\”:\“销售\”,\“ currencyIsoCode \“:\” USD \“,\”金额\“:\” 12.34 \“,\” merchantAccountId \“:\” yourpianobar \“,\” subMerchantAccountId \“:null,\” masterMerchantAccountId \“:null,\ “ orderId \”:null,\“ createdAt \”:\“ 2018-09-19T03:30:27Z \”,\“ updatedAt \”:\“ 2018-09-19T03:30:27Z \”,\“客户\“:{\” id \“:\” 622865439 \“,\” firstName \“:\” Test \“,\” lastName \“:\” FromSwiftTest \“

肯定类似于JSON对象,但我似乎无法用JSONDecoder对其进行解码,这样做会失败。 (JSONEncoder也会失败)

我看到的大多数用于Object将字符串化的JSON数据转换为Swift的解决方案都涉及编写一个swift struct,将所有JSON对象的属性放入其中,但是由于该结果,数据的结构在迅速的结局,我不知道该怎么办。

如何将这些对象放入我的快速代码中?

注意:我还尝试过仅在node.js代码中发送res.send(result),但这并没有真正改变任何东西。

2 个答案:

答案 0 :(得分:1)

这可以解决Swift 5的问题:

    if let data = dataString.data(using: String.Encoding.utf8) {
        do {
            if let dictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any] {
                // Use this dictionary
                print(dictionary)
            }
        } catch _ {
            // Do nothing
        }
    }

答案 1 :(得分:0)

您可以对数据使用JSONSerialization类,根据您的json响应将其从数据转换为Dictionary / Array。代码看起来像下面(基于我的理解),很快4

import { Component } from '@angular/core';

@Component({
  selector: 'app-foo-providers',
  template: `
  <h1>My name is {{foo}}</h1>
  `,
  styleUrls: ['./foo-providers.component.css']
})
export class FooProvidersComponent {

  foo = 'john';
  constructor() { }

}