ios - fit - El texto JSON no comenzó con una matriz u objeto ni opción para permitir que los fragmentos no se establezcan
uisearchbar swift 4 (4)
El JSON que publicaste se ve bien. Si eso es lo que recibió su aplicación iOS, se analizaría. Incluso si no fuera correcto, no obtendría este mensaje de error. JSON debe comenzar con ''['' si es una matriz, y ''{'' si es un diccionario como el suyo, y todo lo demás recibe el mensaje de error que recibió. Así que incluso si envió ''[934knsdf239] [@@@'' no obtendría este mensaje de error, porque los datos comienzan con [indicando una matriz.
Debes depurar esto en la aplicación iOS. Primero convierta los datos en una cadena e imprima eso y verifíquelo. Si la cadena se ve bien, imprima los datos en sí, a veces las personas logran agregar 0 bytes o caracteres de control, o marcadores de orden de dos bytes o algo similar que son invisibles en la cadena pero que no son JSON legales.
La opción NSJSONReadingAllowFragments permite a JSON que consiste solo en una cadena, número, booleano o valor nulo. No use esto a menos que desee poder procesar uno de estos por su cuenta.
Enviaré esta respuesta json del servidor para una solicitud a mi aplicación 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"
}
]
}
}
}
Uso el siguiente código para analizar el JSON anterior al objeto NSDictionary.
NSMutableDictionary *json=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
Pero obtengo este error en el código anterior.
Error Domain = NSCocoaErrorDomain Code = 3840 "La operación no pudo completarse. (Error de cacao 3840.)" (El texto JSON no comenzó con la matriz o el objeto y la opción para permitir que no se establezcan los fragmentos). UserInfo = 0x8a8a700 {NSDebugDescription = JSON text no comenzó con matriz u objeto ni opción para permitir que no se establezcan fragmentos.}
Por lo general, se debe a un mensaje de advertencia lanzado desde su servidor sin ponerlo en la matriz de respuesta. Por ejemplo, en PHP, algunos "mensajes de advertencia" no quedan atrapados en su matriz, de modo que cuando finalmente utiliza "echo json_encode ($ RESPONSE_ARR)", no es un formato JSON.
Me encontré con el mismo error al consumir un feed de una página php. Tal como lo vio, la cadena json resultante pasó una inspección visual, pero no se pudo serializar. Mi sospecha era que había un personaje oculto en algún lugar del feed, así que convertí cada carácter a su equivalente decimal unicode y examiné los resultados:
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);
}
Encontré eso antes del primer personaje y después del último fue el personaje # 65279. Después de una rápida búsqueda en Google, encontré ¿Qué es este char? 65279 , donde esto se identificó como una marca de orden de bytes .
En mi caso, pude arreglar esto en la fuente abriendo y guardando todos los archivos php incluidos, usando un editor de texto que proporcionaba una opción para usar la codificación "Codificar en UTF-8 sin BOM". Para obtener más información sobre el lado php, consulte Cómo evitar el eco del carácter 65279 en php?
Me enfrenté al mismo problema. Pero descubrí que la URL que estaba enviando como un param al servidor era incorrecta. Hubo un pequeño error de personaje. Por ejemplo, estaba enviando la siguiente URL
URL = https://somerUrl/api/v2/&venues/search?client_id=jkdasljf3242jka-fsdf-fadsfasd&lat=40.712488&long=-74.006277&distance=25
El error fue extra y símbolo en frente de los lugares que causaban problemas. Así que eliminé y el símbolo funcionó y funcionó para mí. Por lo tanto, asegúrese de enviar el parámetro correcto al servidor.