NSDebugDescription = "Текст JSON не начинался с массива или объекта и не позволял фрагментам не устанавливать".;

Я использую AFJSONRequestOperation, чтобы запросить сервер и проанализировать возвращаемый ответ JSON, но при разборе я получил эту ошибку:

NSDebugDescription = "JSON text did not start with array or object and option to allow fragments not set.";

Я проверил API и вернул данные JSON:

header('Content-type: text/json');
$arr[] = array("Message" => "update succeeded");
echo '{"Result":'.json_encode($arr).'}';

Любая идея, как это исправить?

ИЗМЕНИТЬ

Я попытался вызвать API из браузера и включить запрос в URL-адрес, и поэтому получил правильный ответ JSON:

{"Result":[{"Message":"update succeeded"}]}

Ответы

Ответ 1

Во-первых, json_encode весь объект, а не разбивка на него.

Во-вторых, если $arr не содержит несколько элементов (непонятно из приведенного выше примера), он должен быть инициализирован следующим образом:

$arr = array("Message" => "update succeeded");

Я все еще не уверен, что еще может быть проблемой здесь. Вы должны повторить то, что получает ваше приложение, и это должно указывать на проблему.

Ответ 2

Пожалуйста, используйте приемлемый тип контента. в вашем веб-сервисе, который должен быть только простым текстом.

вот мой быстрый код и исправлено:

    let manager = AFHTTPRequestOperationManager()

    manager.requestSerializer=AFJSONRequestSerializer()
    manager.responseSerializer = AFHTTPResponseSerializer();

    manager.GET(

        baseURL + (webServiceType as String) + secureParam,
        parameters:[:],

        success:
        { (operation: AFHTTPRequestOperation!,
            responseObject: AnyObject!) in
            completion(obj: responseObject)
        },
        failure:
        { (operation: AFHTTPRequestOperation!,
            error: NSError!) in
            completion(obj: nil)
    })

Ответ 3

Проверьте, что вы добавили/api/перед вашим базовым URL-интерфейсом API, например

http://someurl/yourBasrUrl/api/apiName

Ответ 4

Чтобы сделать правильный ответ json, ваш код должен выглядите примерно так:

$response = array(
    "Result" => array(
        "Message" => "update succeeded"
    )
)

echo json_encode($response);

Ответ 5

Если вам нужно прочитать фрагмент json, вы можете использовать опцию .allowFragments следующим образом:

JSONSerialization.jsonObject(with: someData, options: .allowFragments)

Ответ 6

Пожалуйста, попробуйте это:

let manager = AFHTTPSessionManager(baseURL: NSURL("Base URL"))
manager.requestSerializer = AFJSONRequestSerializer()
manager.responseSerializer = AFJSONResponseSerializer()

 let params = [
    "foo": "bar"
]

manager.POST("API url", parameters: params, 

success: {
    (task: NSURLSessionDataTask!, responseObject: AnyObject!) in
        print("success") 
}, 

failure: {
    (task: NSURLSessionDataTask!, error: NSError!) in
        print("error")
})

Ответ 7

Во-первых, ваш API-интерфейс возвращается некорректно Content-Type. Правильный тип контента для данных JSON - application/json. Это может привести к конфликту при использовании сторонних библиотек.

Во-вторых, вы не должны создавать строку json "вручную". В целом API-интерфейс должен быть изменен следующим образом:

header('Content-type: application/json');
$arr[] = array("Message" => "update succeeded");
echo json_encode(array('Result' => $arr));

Последняя летучая мышь не в последнюю очередь. Возможна еще одна вещь: у вас могут быть символы спецификации в самом начале вашего PHP-скрипта API. Это пробелы, поэтому вы можете не увидеть их в браузере. Убедитесь, что ваши PHP файлы закодированы без спецификации.