Разобрать объект json по ответу внутри WKWebView (Swift, iOS) - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь получить объект json из запроса внутри WKWebView. Пока я могу получить только строку html из тела, но она обернута в некоторые теги (например, <pre>). Как я могу сделать это, не используя третьи части библиотеки? А также получить тело непосредственно от ответа?

Мой код демонстрирует, что у меня есть сейчас, и не дает мне того, что мне нужно. Я использую методы делегата WKNavigationDelegate и evaluateJavaScript для получения внутреннего htmlText тела

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!){
        webView.evaluateJavaScript("document.body.innerHTML") { (anyObject, error) in
            guard let htmlStr = anyObject as? String else {
                return 
            }
            let data: Data = htmlStr.data(using: .utf8)!
            do {
                let jsObj = try JSONSerialization.jsonObject(with: data, options: .init(rawValue: 0))
                if let jsonObjDict = jsObj as? Dictionary<String, Any> {
                    let threeDSResponse = ThreeDSResponse(dict: jsonObjDict)
                    print(threeDSResponse)
                }
            } catch _ {
                print("having trouble converting it to a dictionary")
            }
        }
    }

Теперь я получаю htmlStr как

"{\" идентификатор \ ": 68324947, \" is_test \ "ложь \" Статус \ ": 2, \" status_description \ ": \" 055 - Неверная транзакция \ "}"

и хотите получить его напрямую как json (разобрать) из

{\ "идентификатор \": 68324947, \ "is_test \" ложь \ "Статус \": 2, \ "status_description \": \ "055 - Неверная транзакция \ "}

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

1 Ответ

0 голосов
/ 25 июня 2019

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

do {
    let dec = JSONDecoder()
    dec.keyDecodingStrategy = .convertFromSnakeCase
    let res = try dec.decode(Root.self, from:Data(htmlStr.utf8))
    print(res)
} catch  {
    print("having trouble converting it to a dictionary" , error)
}

struct Root : Codable {
    let id,status:Int
    let isTest:Bool
    let statusDescription:String
}
...