Ошибка домена = код NSCocoaErrorDomain = 3840 при синтаксическом анализе JsonString в Swift5 - PullRequest
0 голосов
/ 26 сентября 2019

Я получаю пуш-сообщение.Кажется, это jsonString.

Но это не меняется на jsonArray.В чем проблема?

AppDelegate.swift

        guard
            let aps = data[AnyHashable("aps")] as? NSDictionary,
            let alert = aps["alert"] as? NSDictionary,
            let body = alert["body"] as? String
            else {
                Log.Error("it's not good data")
                return
        }
        let jsonStringData : Data = body.data(using: .utf8)!
        Log.Info(jsonStringData)
        do {
            let jsonArray = try JSONSerialization.jsonObject(with: jsonStringData, options : .allowFragments) as? [Dictionary<String,Any>]

                Log.Info(jsonArray) // use the json here

        } catch let error as NSError {
            Log.Error(error)
        }

Значение тела (строка)

{ 
    notification : {

                            "title" : "test title.",  

                            "body" : "test context."            

                      },

     data : {

                    "image" : "http://11.111.111.111:100000000/_img/sample_01.jpg",  

                    "page_url" : "http://11.111.111.111:100000000/test?address=",   

                    "type" : "test"       

             }
}

Журнал тела, как это в форме JSON.Но это не переводится.Я не знаю, что мне не хватает.

** Ошибка: **

Ошибка домена = NSCocoaErrorDomain Code = 3840 "Нет строкового ключа для значения в объекте вокруг символа7.»UserInfo = {NSDebugDescription = Нет строкового ключа для значения в объекте вокруг символа 7.}

1 Ответ

1 голос
/ 26 сентября 2019

Спасибо за @vadian, @Larme, @Sh_Khan и @ Kamran

Как вы сказали, JSON недействительно.Это должно было быть получено JSON.И, как сказал @Larme, мне не нужны были опции, мне не нужно было устанавливать as.Это скорее показало мне предупреждение.

Это сработало

        guard
            let aps = data[AnyHashable("aps")] as? NSDictionary,
            let alert = aps["alert"] as? NSDictionary,
            let body = alert["body"] as? String
            else {
                Log.Error("it's not good data")
                return
        }
        let jsonStringData : Data = body.data(using: .utf8)!
        Log.Info(jsonStringData)
        do {
            let json = try JSONSerialization.jsonObject(with: jsonStringData, options: [])

                Log.Info(json) // use the json here
                guard let jsonArray = json as? [String: Any] else {
                    return
                }
                Log.Debug(jsonArray)
                Log.Debug(jsonArray["data"])

        } catch let error as NSError {
            Log.Error(error)
        }
...