it-swarm.com.ru

Текст 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 «Операция не может быть Завершена. (Ошибка какао 3840.)» (текст JSON не начинался с массива или объекта И опция, позволяющая не задавать фрагменты.) UserInfo = 0x8a8a700 {NSDebugDescription = Текст JSON не начинался с массива или объекта и возможность разрешить фрагменты не установлены.}

12
LvN

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

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 я нашел Что это за символ? 65279 , где это было обозначено как знак порядка байтов .

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

10
Dave Burke

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

2
Kueiapp

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

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

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

1
gnasher729

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

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

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

0
GSK

Проблема возникает из анализа ответа. Вы пытаетесь десериализовать ответ 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()
0
AshvinGudaliya