IOS словарь быстрого преобразования в json строка создает недопустимый JSON - PullRequest
0 голосов
/ 06 августа 2020

У меня есть объект json, который я получаю от обратного вызова iOS api javascript, и я отправлю тот же json на php бэкенд, чтобы проверить его. В android все работает нормально, но в приложении IOS проблема в том, что когда я получаю message.body, который равен json, он отображается, как показано ниже.

{
    OrderNumber = 01869756;
    "customer_key" = SLApO64gAktgmuLl;
    "order_address" = "{\"address\":\"No. 7 Ogwui Road Enugu\",\"city\":\"Enugu\"}";
    "order_amount" = 242550;
    "order_currency" = "₦";
    "order_currency_iso" = NGN;
    "order_shipping" = 0;
    "order_stores" =     {
        zOEZPU8sGCADHRbr8yw4 = {
            amount = 242550;
            currency = "₦";
            delivery = 0;
            total = 242550;
        };
    };
    "order_subtotal" = 242550;
    "order_subtotal_cent" = 24255000;
    "order_tax" = "4123.35";
    "order_tax_cent" = 412335;
    "order_total" = "246673.35";
    "order_total_cent" = 24667335;
    status = 200;
}

Когда я передаю указанное выше IOS форматировать на php backend json_decode($payload) он всегда возвращает null. Пожалуйста, как мне преобразовать это в настоящий формат json Я пробовал код ниже, но он не работает?

 let encoder = JSONEncoder()
  if let jsonData = try? encoder.encode("\(message.body)") {
      if let jsonString = String(data: jsonData, encoding: .utf8) {
         print("dictFromJSON", jsonString)
      }
  }

А также я пробовал это

if let response = message.body as? Dictionary<String, AnyObject> {
   let encoder = JSONEncoder()
      if let jsonData = try? encoder.encode("\(response)") {
          if let jsonString = String(data: jsonData, encoding: .utf8) {
             print("dictFromJSON", jsonString)
          }
      }
}

Но выше вывод кода примерно так, как показано ниже, что не является допустимым json.

[
        "OrderNumber": 01869756,
        "customer_key": SLApO64gAktgmuLl,
        "order_address": {\"address\":\"No. 7 Ogwui Road Enugu\",\"city\": \"Enugu\"};
        "order_amount": 242550,
        "order_currency": &#8358,
        "order_currency_iso: NGN,
        "order_shipping" = 0;
        "order_stores":    {
            zOEZPU8sGCADHRbr8yw4 = {
                amount = 242550;
                currency = "&#8358;";
                delivery = 0;
                total = 242550;
            };
        };
        "order_subtotal": 242550,
        "order_subtotal_cent: 24255000,
        "order_tax": 4123.35,
        "order_tax_cent": 412335,
        "order_total": 246673.35",
        "order_total_cent": 24667335,
        "status" = 200
    ]

1 Ответ

1 голос
/ 06 августа 2020

Поскольку тип message.body равен __NSFrozenDictionaryM, вы можете превратить его в строку JSON, используя JSONSerialization:

if let jsonData = try? JSONSerialization.data(withJSONObject: message.body, options: []) {
    if let jsonString = String(data: jsonData, encoding: .utf8) {
       print("dictFromJSON", jsonString)
    }
}

Если вы хотите, чтобы JSON был красиво отформатирован , передайте .prettyPrinted в options:.


API JSONDecoder здесь не работает так хорошо, как вы имеете дело с JSON в виде словаря. JSONDecoder работает лучше всего, если у вас есть Codable типов.

...