Подтвердить что ты не робот

Текст JSON не начинался с массива или объекта, а опция позволяла не устанавливать фрагменты

Я отправляю этот ответ json от сервера для запроса в мое приложение IOS 7.

{
 "root": {
    "success": "1",
    "message": "Successfully retrieved data.",
    "data": {
        "records": [
            {
                "receipt_key": "xxxxxxxx",
                "receipt_id": "xxxxxxxx",
                "store_name": "xxxxxx",
                "amount": "xxxx",
                "date_purchase": "xxxxxxxx",
                "is_processed": "x",
                "created_on": "xxxxxxxx",
                "modified_on": "xxxxxxxx",
                "modified_on_millis": "xxxxxxxx",
                "user_folder": "xxxxxxxx",
                "category_id": "xxxxxxxx",
                "is_deleted": "x",
                "currency_id": "xxxxxxxx"
            }
        ]
    }
}
}

Я использую следующий код для разбора вышеперечисленного json на объект NSDictionary.

 NSMutableDictionary *json=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];

Но я получаю эту ошибку над приведенным выше кодом.

Ошибка домена = NSCocoaErrorDomain Code = 3840 "Операция не может быть завершено. (Cocoa ошибка 3840.)" (текст JSON не начинался с массива или объект и параметр, позволяющий не создавать фрагменты.) UserInfo = 0x8a8a700 {NSDebugDescription = текст JSON не начинался с массива или объекта и возможность разрешить фрагменты.}

4b9b3361

Ответ 1

Я столкнулся с той же ошибкой при использовании фида с php-страницы. Так же, как вы столкнулись, результирующая строка json прошла визуальный осмотр, но не могла сериализоваться. Мое подозрение состояло в том, что где-то был скрытый символ, поэтому я преобразовал каждый символ в его десятичный эквивалент в unicode и просмотрел результаты:

NSString *feedStr = [[NSString alloc] initWithData:feedData encoding:NSUTF8StringEncoding];
for(int i=0; i<[feedStr length]; ++i)
{
    unichar c = [feedStr characterAtIndex:i];
    NSLog(@"decimal char %d", c);
}

Я обнаружил, что перед первым символом и после последнего был символ # 65279. После быстрого поиска в Google я нашел Что это за char? 65279, где это было определено как байтовый порядок байтов.

В моем случае я смог исправить это в источнике, открыв и сохранил все включенные php файлы, используя текстовый редактор, который предоставил возможность использовать кодировку "Encode in UTF-8 без спецификации". Для получения дополнительной информации о стороне php см. Как избежать эха-символа 65279 в php?

Ответ 2

Обычно это связано с тем, что из вашего сервера выдается предупреждение, не помещая его в массив ответов. Например, в PHP некоторые "предупреждающие сообщения" не попадают в ваш массив, поэтому, когда вы наконец используете "echo json_encode ($ RESPONSE_ARR)", это не формат JSON.

Ответ 3

JSON, который вы разместили, выглядит хорошо. Если это то, что было получено вашим приложением для iOS, он будет разбираться. Даже если это не так, вы не получите это сообщение об ошибке. JSON должен начинаться с '[', если это массив, и '{', если это словарь как ваш, и все остальное вы получаете сообщение об ошибке, которое вы получили. Поэтому даже если вы отправили "[934knsdf239] [@@@", вы не получили бы это сообщение об ошибке, потому что данные начинаются с [указывает на массив.

Вам нужно отладить это в приложении iOS. Сначала преобразуйте данные в строку и распечатайте их и проверьте. Если строка выглядит хорошо, тогда распечатайте сами данные - иногда людям удается добавить 0 байт или управляющие символы или два байтовых байта порядка или что-то подобное, которые невидимы в строке, но не являются законными JSON.

Опция NSJSONReadingAllowFragments позволяет JSON, состоящий только из строки, числа, логического или нулевого значения. Не используйте это, если вы не хотите обрабатывать один из них самостоятельно.

Ответ 4

Я столкнулся с той же проблемой. Но я обнаружил, что Url I, отправляемый как параметр на сервер, был неправильным. Была ошибка одного персонажа. Например, я отправил следующий URL

URL = https://somerUrl/api/v2/&venues/search?client_id=jkdasljf3242jka-fsdf-fadsfasd&lat=40.712488&long=-74.006277&distance=25

Ошибка была лишней и символом перед площадками, создающими проблемы. Так что я удалил, а символ и нашел работу для меня. Поэтому убедитесь, что вы отправляете правильный параметр на сервер.

Ответ 5

Проблема возникает из-за разбора ответа. Вы пытаетесь де-сериализовать ответ JSON (который ДОЛЖЕН содержаться в NSArray или NSDictionary), однако ваш ответ не является ничем из вышеперечисленного (скорее всего, простая строка).

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

Данные вашего сервера не соответствуют формату JSON, а затем распечатывают данные вашего сервера и проверяют, что данные сервера действительны или нет.

URLSession.shared.dataTask(with: url) { (data, response, error) in

        if let jsonData = data {
            do {
                let parsedData = try JSONSerialization.jsonObject(with: jsonData, options: .mutableLeaves) as! [String: AnyObject]
            }
            catch let err{
                print("\n\n===========Error===========")
                print("Error Code: \(error!._code)")
                print("Error Messsage: \(error!.localizedDescription)")
                if let data = data, let str = String(data: data, encoding: String.Encoding.utf8){
                    print("Server Error: " + str)
                }
                debugPrint(error)
                print("===========================\n\n")

                debugPrint(err)
            }
        }
        else {
            debugPrint(error as Any)
        }

    }.resume()