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 файлы закодированы без спецификации.