Невозможно разобрать массив словаря внутри строки - PullRequest
0 голосов
/ 30 мая 2019

В настоящее время я работаю над модулем бронирования автобусов.После того, как пользователь установит свой город отправления и прибытия и дату поездки, ему будет показан список доступных автобусов.Я сделал эту часть успешно.Но проблема, с которой я сталкиваюсь, заключается в том, что каждая шина имеет свою собственную политику отмены, которая представляет собой массив словаря внутри строки.Я не могу разобрать это.Внутри каждого словаря «apiAvailableBuses» есть ключ «cancellationPolicy», в качестве значения которого используется строка, содержащая массив словаря.Я удалил другие пары значений ключа из «apiAvailableBuses».

Список доступных автобусов Ответ JSON:

"apiAvailableBuses":[
   {
      "cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
   },
   {
      "cancellationPolicy":"[{\"cutoffTime\":\"9-12\",\"refundInPercentage\":\"25\"},{\"cutoffTime\":\"12-24\",\"refundInPercentage\":\"35\"},{\"cutoffTime\":\"24-48\",\"refundInPercentage\":\"50\"},{\"cutoffTime\":\"48-60\",\"refundInPercentage\":\"75\"},{\"cutoffTime\":\"60\",\"refundInPercentage\":\"90\"}]"
   },
   {
      "cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
   },
   {
      "cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
   },
   {
      "cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
   },
   {
      "cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
   },
   {
      "cancellationPolicy":"[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
   },
   {
      "cancellationPolicy":"[{\"cutoffTime\":\"6-24\",\"refundInPercentage\":\"70\"},{\"cutoffTime\":\"24\",\"refundInPercentage\":\"85\"}]"
   }
]

Может кто-нибудь помочь мне с решением для этого?Если кто-то не может понять мой вопрос, пожалуйста, дайте мне знать.

Примечание: я не использую Codable в своем проекте.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 30 мая 2019

Используйте Codable для анализа вышеуказанного JSON response.

Если ваш JSON response имеет следующий формат:

{
  "apiAvailableBuses": [
    {
      "cancellationPolicy": [
        {
          "cutoffTime": "5",
          "refundInPercentage": "90"
        }
      ]
    }
  ]
}

Создать Codable typesдля анализа вышеуказанного ответа.

struct AvailableBuses: Codable {
    var apiAvailableBuses: [Bus]
}

struct Bus: Codable {
    var cancellationPolicy: [CancellationPolicy]
}

struct CancellationPolicy: Codable {
    var cutoffTime: String
    var refundInPercentage: String
}

В приведенном выше коде я создал 3 struct, соответствующий Codable protocol - AvailableBuses, Bus, CancellationPolicy

Использование:

После получения data от вашего API response, вы можете parse использовать его, как описано выше structs как,

if let data = jsonStr.data(using: .utf8) {
    do {
        let availableBuses = try JSONDecoder().decode(AvailableBuses.self, from: data)
        print(availableBuses)
    } catch {
        print(error)
    }
}
0 голосов
/ 30 мая 2019

Если по какой-то причине вы не хотите использовать Codable, вы можете использовать JSONSerialization.

let input = "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
let data = input.data(using: .utf8)!
let parsed = try! JSONSerialization.jsonObject(with: data, options: []) as! Array<Dictionary<String, Any>>

print(parsed) // [["refundInPercentage": 90, "cutoffTime": 5]]
0 голосов
/ 30 мая 2019

Вы можете проанализировать строку JSON, используя следующий метод:

// JSON Format
    let jsonResponse = ["apiAvailableBuses": [
        [
            "cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
        ],
        [
            "cancellationPolicy": "[{\"cutoffTime\":\"9-12\",\"refundInPercentage\":\"25\"},{\"cutoffTime\":\"12-24\",\"refundInPercentage\":\"35\"},{\"cutoffTime\":\"24-48\",\"refundInPercentage\":\"50\"},{\"cutoffTime\":\"48-60\",\"refundInPercentage\":\"75\"},{\"cutoffTime\":\"60\",\"refundInPercentage\":\"90\"}]"
        ],
        [
            "cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
        ],
        [
            "cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
        ],
        [
            "cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
        ],
        [
            "cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
        ],
        [
            "cancellationPolicy": "[{\"cutoffTime\":\"5\",\"refundInPercentage\":\"90\"}]"
        ],
        [
            "cancellationPolicy": "[{\"cutoffTime\":\"6-24\",\"refundInPercentage\":\"70\"},{\"cutoffTime\":\"24\",\"refundInPercentage\":\"85\"}]"
        ]
        ]
    ]

// Function Calling
        setBuses(json: jsonResponse)

// Function to Parse JSON
func setBuses(json: Dictionary<String,Any>) {
    guard let buses = json["apiAvailableBuses"] as? [Dictionary<String,Any>] else { return }
    for (index, bus) in buses.enumerated() {
        print("\n\nBus #\(index+1)")
        guard let policies = convertToDictionary(text: bus["cancellationPolicy"] as! String) else { return }
        for (index, policy) in policies.enumerated() {
            print("\nPolicy #\(index+1)")
            print("cutoffTime #\(index+1) \(String(describing: policy["refundInPercentage"]))")
            print("refundInPercentage #\(index+1) \(String(describing: policy["cutoffTime"]))")
        }
    }
}

func convertToDictionary(text: String) -> [Dictionary<String,Any>]? {
    let data = text.data(using: .utf8)!
    do {
        if let jsonObj = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>] {
            return jsonObj
        } else {
            print("JSON Error")
        }
    } catch let error as NSError {
        print(error)
    }
    return nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...