Alamofire Swift 5: выдает ошибку при передаче параметра - PullRequest
1 голос
/ 29 мая 2020

Мое значение параметра выглядит так, когда оно печатается в консоли, из-за чего я получаю сообщение об ошибке:

сбой (Alamofire.AFError.responseSerializationFailed (причина: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed (ошибка: Error Domain = NSCocoaErrorDomain Code = 3840 «Недопустимое значение около символа 0» UserInfo = {NSDebugDescription = Недопустимое значение около символа 0.})))

["preparation_method[]": "[{\"method_stage\":\"0\",\"method_description\":\"This is test methof1\"}]", "recipe_id": "10454", "ingredients[]": "[{\"ingredient_unit_id\":\"Cup\",\"ingredient_item_id\":\"1\",\"ingredient_item\":\"Rice\",\"ingredient_remark\":\"\",\"ingredient_qty\":\"1\"},{\"ingredient_unit_id\":\"\",\"ingredient_item_id\":\"2\",\"ingredient_item\":\"\",\"ingredient_remark\":\"\",\"ingredient_qty\":\"\"},{\"ingredient_unit_id\":\"\",\"ingredient_item_id\":\"3\",\"ingredient_item\":\"\",\"ingredient_remark\":\"\",\"ingredient_qty\":\"\"}]"]

формат, в котором Параметр должен выглядеть так, как показано ниже:

["recipe_id" : "10454", 
ingredients[]: [{"ingredient_unit_id":"Cup","ingredient_item_id":"1","ingredient_item":"Rice","ingredient_remark":"","ingredient_qty":"1"},
{"ingredient_unit_id":"","ingredient_item_id":"2","ingredient_item":"","ingredient_remark":"","ingredient_qty":""},
{"ingredient_unit_id":"","ingredient_item_id":"3","ingredient_item":"","ingredient_remark":"","ingredient_qty":""}],
 preparation_method[] : 
[{"method_stage":"0","method_description":"This is test methof1"}] ]

Я использовал код

let arr = ingredient.map({ Model(ingredient_item: $0,
                                  ingredient_item_id: $1,
                                  ingredient_qty: $2,
                                  ingredient_unit_id: $3,
                                  ingredient_remark: $4)})

        let jsonData = try! JSONEncoder().encode(arr)
        let jsonString = String(data: jsonData, encoding: .utf8)
        let ingredientstring = jsonString?.replacingOccurrences(of: "'\'" , with: "")
        let ingredientarrayvalue = "\(ingredientstring!)"
        print(ingredientarrayvalue)
        let ingredient_array = String(ingredientarrayvalue)


        let arr1 = prepatation.map({ Model1(method_stage: $0,
                                  method_description: $1)})

        let jsonData1 = try! JSONEncoder().encode(arr1)
        let jsonString1 = String(data: jsonData1, encoding: .utf8)
        let preparationstring = jsonString1?.replacingOccurrences(of: "'\'" , with: "")
        let preparationarrayvalue = "\(preparationstring!)"
        print(preparationarrayvalue)
        let preparation_array = String(preparationarrayvalue)


        let parameter = ["recipe_id" : recipevalue, "ingredients[]" : ingredient_array, "preparation_method[]" : preparationarrayvalue]
        print(parameter)

 let url = RECIPE.recipeSAVEURL
  AF.request(url, method: .post, parameters: parameter).responseJSON(completionHandler: {response in

            print(response)
            if let response_data = response.value as? NSDictionary{

                let responsestatus = response_data.value(forKey: "response") as! String
                print(responsestatus)

                if responsestatus == "success"{
                }
            }
        })

Как я могу передать параметр без "\" в параметре? Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 29 мая 2020

После утомительных часов поиска решения моего вышеупомянутого вопроса я наткнулся на следующую ссылку на github: https://gist.github.com/cprovatas/5c9f51813bc784ef1d7fcbfb89de74fe

Где они используют расширение для данных, и я применил его как показано ниже в моем коде:

let preparation_array = jsonString1!.data(using: .utf8)!.prettyPrintedJSONString!
let ingredient_array = jsonString!.data(using: .utf8)!.prettyPrintedJSONString!

копия кода расширения, используемого в упомянутой выше ссылке, приведена ниже для справки, если таковая имеется:

extension Data {
    var prettyPrintedJSONString: NSString? { /// NSString gives us a nice sanitized debugDescription
        guard let object = try? JSONSerialization.jsonObject(with: self, options: []),
              let data = try? JSONSerialization.data(withJSONObject: object, options: [.prettyPrinted]),
              let prettyPrintedString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) else { return nil }

        return prettyPrintedString
    }
}

let str = "{\"foo\": \"bar\"}".data(using: .utf8)!.prettyPrintedJSONString!
debugPrint(str)

/ * печатает: { "foo": "bar"}

...