在我的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)
,但这并没有真正改变任何东西。
答案 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() { }
}