JSON 节点的顺序在发出 POST 请求时发生变化 Swift

Order of JSON node changes while making POST request Swift

我正在尝试 post 以下 jSON 正文 请求 JSON :

let parameters =  [
        "createTransactionRequest": [
            "merchantAuthentication": [
                "name": "xxxxxxxx",
                "transactionKey": "xxxxxxxxx"
            ],
            "refId": "123456",
            "transactionRequest": [
                "transactionType": "authCaptureTransaction",
                "amount": "5",
                "payment": [
                    "opaqueData": [
                        "dataDescriptor": desc!,
                        "dataValue": tocken!
                    ]
                ]
            ]
        ]
    ]

当我尝试打印(参数)时,节点的顺序发生变化,看起来像

["createTransactionRequest":

 ["refId": "123456", 
"transactionRequest":

 ["payment":  ["opaqueData": ["dataDescriptor": "COMMON.ACCEPT.INAPP.PAYMENT", "dataValue": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx="]],

 "transactionType": "authCaptureTransaction",

 "amount": "5"],

 "merchantAuthentication": ["name": "xxxxxxx", "transactionKey": 

"6gvE46G5seZt563w"]
]
]

我收到类似

的回复
{ messages =     {
        message =         (
                        {
                code = E00003;
                text = "The element 'createTransactionRequest' in namespace

 'AnetApi/xml/v1/schema/AnetApiSchema.xsd' has invalid child element 

'refId' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'. List of

 possible elements expected: 'merchantAuthentication' in namespace 

'AnetApi/xml/v1/schema/AnetApiSchema.xsd'.";
            }
        );
        resultCode = Error;
    };
}

这真的很烦人。任何人的帮助将不胜感激。

您需要按如下方式更改您的数据结构:

struct Transaction: Codable {
    let createTransactionRequest: CreateTransactionRequest
}
struct CreateTransactionRequest: Codable {
    let merchantAuthentication: MerchantAuthentication
    let refId: String
    let transactionRequest: TransactionRequest
}
struct MerchantAuthentication: Codable {
    let name: String
    let transactionKey: String
}
struct TransactionRequest: Codable {
    let transactionType: String
    let amount: String
    let payment: Payment
}
struct Payment: Codable {
    let opaqueData: OpaqueData
}
struct OpaqueData: Codable {
    let dataDescriptor: String
    let dataValue: String
}

测试

let json = """
    { "createTransactionRequest":
        { "merchantAuthentication":
            { "name": "YOUR_API_LOGIN_ID",
               "transactionKey": "YOUR_TRANSACTION_KEY"
             },
          "refId": "123456",
          "transactionRequest":
               { "transactionType": "authCaptureTransaction",
                 "amount": "5",
                 "payment":
                   { "opaqueData":
                       { "dataDescriptor": "COMMON.ACCEPT.INAPP.PAYMENT",
                         "dataValue": "PAYMENT_NONCE_GOES_HERE"
                        }
                    }
                }

             }

          }
"""
let jsonData = Data(json.utf8)
do {
    let transaction = try JSONDecoder().decode(Transaction.self, from: jsonData)
    print(transaction)
    // encoding
    let encodedData = try JSONEncoder().encode(transaction)
    print(String(data: encodedData, encoding: .utf8)!)
} catch {
    print(error)
}

{"createTransactionRequest":{"merchantAuthentication":{"name":"YOUR_API_LOGIN_ID","transactionKey":"YOUR_TRANSACTION_KEY"},"refId":"123456","transactionRequest":{"transactionType":"authCaptureTransaction","amount":"5","payment":{"opaqueData":{"dataValue":"PAYMENT_NONCE_GOES_HERE","dataDescriptor":"COMMON.ACCEPT.INAPP.PAYMENT"}}}}}