首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由于错误,JSON无法序列化:数据无法读取,因为它的格式不正确。

由于错误,JSON无法序列化:数据无法读取,因为它的格式不正确。
EN

Stack Overflow用户
提问于 2020-03-27 09:03:07
回答 1查看 1.2K关注 0票数 0

如何在带有Alamofire 5的HTTP正文中发送带有嵌套对象的POST请求,如字典数组作为参数?我未能通过JSONSerialization以正确的格式转换对象,不知道下一步该做什么吗?

我的JSON对象,它需要作为参数传递

代码语言:javascript
运行
复制
{
"OrderProducts": [
        {
            "ProductId": 2,
            "PrimaryModifierId": 20,
            "SecondaryModifierId": 13,
            "ProductBasePrice": 100,
            "ProductDiscount": 10,
            "Quantity": 3,
            "Total": 270
        },
        {
            "ProductId": 3,
            "PrimaryModifierId": 1,
            "SecondaryModifierId": 6,
            "ProductBasePrice": 120,
            "ProductDiscount": 10,
            "Quantity": 2,
            "Total": 216
        }
    ],
    "OrderDeals": [
        {
            "DealId": 1,
            "DealPrice": 2299,
            "Quantity": 3,
            "Total":6897
        },
        {
            "DealId": 2,
            "DealPrice": 1299,
            "Quantity": 1,
            "Total":1299
        }
    ],
   "OrderDetail": {
            "UserId": 5,
            "PaymentMethodId": 1,
            "OrderPromoCodeId": 1,
            "AddressId": 12,
            "ProductTotal": 700,
            "DealTotal": 500,
            "SubTotal": 1200,
            "ShippingCharges": 300,
            "Tax": 100,
            "TotalPrice": 1600
        },
    "PaymentDetail": {
            "LastFour": 1234,
            "TransactionReference": "sad",
            "TransactionStatus": "Aproved"
        }

}

我的邮政请求功能

代码语言:javascript
运行
复制
 func OrderCreate(OrderProduct:[[String:Any]] , PaymentDetail:[String:Any], OrderDetail:[String:Any], OrderDeals:[[String:Any]],  completionHandler:@escaping (_ success:OrderCreateModelClass.OrderCreateModel?, Error?) -> ()){

    let header : HTTPHeaders = [
                Api.Params.contentType:Api.Params.applicationJSON,
               Api.Params.authorization:requestManager.instance.getToken!
            ]

    let params : [String:Any] = [
        "OrderProducts" : OrderProduct ,
        "OrderDeals" : OrderDeals,
        "OrderDetail" : OrderDetail,
        "PaymentDetail" : PaymentDetail
    ]

    manager.request(Api.CONSTANTS_METHODS.ORDER_CREATE_API, method: .post, parameters: params, encoding: JSONEncoding.default, headers: header).responseJSON { (response) in
                    switch response.result {
                    case .success(let validResponse):
                        guard let res = validResponse as? [String:Any] else {return}
                        if ((res["flag"] as? Int) != nil) {
                        let data = try! JSONSerialization.data(withJSONObject: validResponse.self, options: [])
                            let resultObject = try! JSONDecoder().decode(OrderCreateModelClass.OrderCreateModel.self, from: data)
                        completionHandler(resultObject,nil)
                        } else {
                        completionHandler(nil,nil)
                        }
                    case .failure(let error):
                        print("FailedNot")
                        switch (response.response?.statusCode) {
                        case 404:
                            print("not Found")
                        case 401:
                            print("unauthorized")
                        case 408:
                            print("request timeout")
                        case 406:
                            print("Unable to format response according to Accept header")
                        completionHandler(nil,error)
                        default:
                            print(error.localizedDescription)
                        }
                }
        }
}

获取的错误

格式糟糕的Json对象看起来如下(转换后打印)

编辑:

Func在Dilan的解决方案之后(但仍然给出相同的错误)如下所示

代码语言:javascript
运行
复制
func OrderCreate(OrderProduct:[[String:Any]] , PaymentDetail:[String:Any], OrderDetail:[String:Any], OrderDeals:[[String:Any]],  completionHandler:@escaping (_ success:OrderCreateModelClass.OrderCreateModel?, Error?) -> ()){

    let header : HTTPHeaders = [
                Api.Params.contentType:Api.Params.applicationJSON,
               Api.Params.authorization:requestManager.instance.getToken!
            ]

    var products = [Parameters]()
    var deals = [Parameters]()

    OrderProduct.forEach { (product) in
            let item:Parameters = [
            "ProductId": product["ProductId"] as? Int ?? 0,
            "PrimaryModifierId": product["PrimaryModifierId"] as? Int ?? 0,
            "SecondaryModifierId": product["SecondaryModifierId"] as? Int ?? 0,
            "ProductBasePrice": product["ProductBasePrice"] as? Double ?? 0,
            "ProductDiscount": product["ProductDiscount"] as? Double ?? 0,
            "Quantity": product["Quantity"] as? Double ?? 0,
            "Total": product["Total"] as? Double ?? 0
        ]
        products.append(item)
    }

    OrderDeals.forEach { (deal) in
        let item : Parameters = [
            "DealId" : deal["DealId"] as? Int ?? 0,
            "DealPrice" : deal["DealPrice"] as? Int ?? 0,
            "Quantity" : deal["Quantity"] as? Int ?? 0,
            "Total" : deal["Total"] as? Int ?? 0
        ]
        deals.append(item)
    }

    let paymentDetail : Parameters = [

        "LastFour" : PaymentDetail["LastFour"] as? Int ?? 0,
        "TransactionReference" : PaymentDetail["TransactionReference"] as? Int ?? 0,
        "TransactionStatus" : PaymentDetail["TransactionStatus"] as? Int ?? 0
    ]

    let orderDetail : Parameters = [
        "UserId" : OrderDetail["UserId"] as? Int ?? 0,
        "PaymentMethodId" : OrderDetail["PaymentMethodId"] as? Int ?? 0,
        "OrderPromoCodeId" : OrderDetail["OrderPromoCodeId"] as? Int ?? 0,
        "AddressId" : OrderDetail["AddressId"] as? Int ?? 0,
        "ProductTotal" : OrderDetail["ProductTotal"] as? Int ?? 0,
        "DealTotal" : OrderDetail["DealTotal"] as? Int ?? 0,
        "SubTotal" : OrderDetail["SubTotal"] as? Int ?? 0,
        "ShippingCharges" : OrderDetail["ShippingCharges"] as? Int ?? 0,
        "Tax" : OrderDetail["Tax"] as? Int ?? 0,
        "TotalPrice" : OrderDetail["TotalPrice"] as? Int ?? 0
    ]

    let params : [String:Any] = [
        "OrderProducts" : products ,
        "OrderDeals" : deals,
        "OrderDetail" : orderDetail,
        "PaymentDetail" : paymentDetail
    ]



    manager.request(Api.CONSTANTS_METHODS.ORDER_CREATE_API, method: .post, parameters: params, encoding: JSONEncoding.default, headers: header).responseJSON { (response) in


                    switch response.result {
                    case .success(let validResponse):
                        guard let res = validResponse as? [String:Any] else {return}
                        if ((res["flag"] as? Int) != nil) {
                        let data = try! JSONSerialization.data(withJSONObject: validResponse.self, options: [])
                            let resultObject = try! JSONDecoder().decode(OrderCreateModelClass.OrderCreateModel.self, from: data)
                        completionHandler(resultObject,nil)
                        } else {
                        completionHandler(nil,nil)
                        }
                    case .failure(let error):
                        print("FailedNot")
                        switch (response.response?.statusCode) {
                        case 404:
                            print("not Found")
                        case 401:
                            print("unauthorized")
                        case 408:
                            print("request timeout")
                        case 406:
                            print("Unable to format response according to Accept header")
                        completionHandler(nil,error)
                        default:
                            print(error.localizedDescription)
                        }
                }
        }
}
EN

回答 1

Stack Overflow用户

发布于 2020-03-27 09:54:36

在alamofire中,我们不能转换这种json(使用嵌套数组),directly.You应该将其对象从内到外转换为参数。

在将 OrderProduct 添加到params之前,需要循环OrderProduct数组并创建Alamofire参数对象数组,然后可以将该数组添加到param数组中,

代码语言:javascript
运行
复制
var products:[Parameters] = [:]

OrderProduct.forEach { (product) in

    let item:Parameters = [
        "ProductId": product["ProductId"] as? Int ?? 0,
        "PrimaryModifierId": product["PrimaryModifierId"] as? Int ?? 0,
        "SecondaryModifierId": product["SecondaryModifierId"] as? Int ?? 0,
        "ProductBasePrice": product["ProductBasePrice"] as? Double ?? 0,
        "ProductDiscount": product["ProductDiscount"] as? Double ?? 0,
        "Quantity": product["Quantity"] as? Double ?? 0,
        "Total": product["Total"] as? Double ?? 0
    ]

    products.append(item)

}

有关订购详情

代码语言:javascript
运行
复制
var orderDetails:Parameters = [

            "UserId": OrderDetail["UserId"] as? Int ?? 0,
            //other fields
]

对其他需要的参数执行同样的操作,然后您可以使用这些预先创建的参数创建params。

代码语言:javascript
运行
复制
let params : [String:Any] = [
        "OrderProducts" : [products] ,//pre created param array
        "OrderDeals" : OrderDeals,
        "OrderDetail" : orderDetails, // pre created param
        "PaymentDetail" : PaymentDetail
    ]

我想你明白了

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60882843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档