Tengo este método:
public static Object parseStringToObject(String json) {
String Object = json;
Gson gson = new Gson();
Object objects = gson.fromJson(object, Object.class);
parseConfigFromObjectToString(object);
return objects;
}
Y quiero analizar un JSON con:
public static void addObject(String IP, Object addObject) {
try {
String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
addObject = ConfigJSONParser.parseStringToObject(json);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Pero recibo un mensaje de error:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: se esperaba BEGIN_OBJECT pero era STRING en la línea 1, columna 1
Respuestas:
Incluso sin ver su cadena JSON, puede saber por el mensaje de error que no es la estructura correcta para analizarla en una instancia de su clase.
Gson espera que su cadena JSON comience con una llave de apertura de objeto. p.ej
Pero la cadena que le ha pasado comienza con comillas abiertas
fuente
parseStringToObject
sugiere que espera un objeto JSON, que siempre comienza con{
.{"ip":"192.167.1.15"}
desdeRestful EJB web service with jboss EAP 7.1
el backend. Sin embargo, obtengo el mensaje "Se esperaba BEGIN_OBJECT pero era STRING en la línea 1, columna 1". Ayúdenme ... Este es mi servicio web: @Stateless @Path ("/ getflashcard") public class GetFlashcard {@Interceptors (Validator.class) @GET @Produces (MediaType.APPLICATION_JSON) public String getFlashcard () {String jsonString = new JSONObject (). Put ("ip", "192.167.1.15"). ToString (); return jsonString; }}JSON no válido del servidor siempre debe ser un caso de uso esperado. Un millón de cosas pueden salir mal durante la transmisión. Gson es un poco complicado, porque su salida de error le dará un problema, y la excepción real que detecte será de un tipo diferente.
Con todo eso en mente, la solución adecuada por parte del cliente es
Si desea saber por qué el JSON que recibió del servidor es incorrecto, puede mirar dentro de su bloque de captura en la excepción. Pero incluso si es su problema, no es responsabilidad del cliente reparar el JSON que recibe de Internet.
De cualquier manera, es responsabilidad del cliente decidir qué hacer cuando el JSON se vuelve incorrecto. Dos posibilidades son rechazar el JSON y no hacer nada y volver a intentarlo.
Si va a intentarlo de nuevo, le recomiendo que coloque una bandera dentro del bloque try / catch y luego responda a esa bandera fuera del bloque try / catch. El try / catch anidado es probablemente la forma en que Gson nos metió en este lío con el seguimiento de la pila y las excepciones que no coinciden.
En otras palabras, aunque admito que no se ve muy elegante, recomendaría
fuente
En Retrofit2, cuando desee enviar sus parámetros en bruto, debe utilizar Scalars.
primero agregue esto en su gradle:
mi SampleActivity:
Referencia: [ ¿Cómo PUBLICAR JSON completo sin procesar en el cuerpo de una solicitud de modificación?
fuente
Tal vez
JSON Object
tenga razón, pero la respuesta que recibió no es su información válida. Al igual que cuando conecta el inválidoWiFi
, puede recibir una respuesta extraña< html>.....< /html>
queGSON
no puede analizar.es posible que deba hacer algo
try..catch..
para esta extraña respuesta para evitar un bloqueo.fuente
Vengo a compartir una solución. El error me sucedió después de forzar el cierre del notbook. posible solución
clean preject
.fuente
Asegúrese de tener objetos DESERIALIZADOS como DATE / DATETIME, etc. Si está enviando JSON directamente sin deserializarlo, puede causar este problema.
fuente
En mi situación, tengo un "modelo", que consta de varios parámetros de cadena, con la excepción de uno: es una matriz de bytes
byte[]
. Algún fragmento de código:La última línea de arriba es cuando el
se activa. Buscando a través del SO, me di cuenta de que necesito tener alguna forma de
Adapter
convertir miBaseModel
de un lado a otro en un JsonObject. Haber mezcladoString
ybyte[]
en un modelo complica la cosa. Aparentemente,Gson
no me gusta mucho la situación.Termino haciendo un
Adapter
para asegurar quebyte[]
se convierta aBase64
formato. Aquí está miAdapter
clase:Para convertir JSONObject en modelo, utilicé lo siguiente:
De manera similar, para convertir el modelo a JSONObject, utilicé lo siguiente:
Lo que está haciendo el código es básicamente empujar lo deseado
class/object
(en este caso, labyte[]
clase) a través delAdapter
siempre que se encuentre durante la conversión a / fro JSONObject.fuente
No lo use
jsonObject.toString
en un objeto JSON.fuente
En mi caso, estoy devolviendo el objeto JSON como
Resuelto cambiándolo como
Aquí los datos son un objeto JsonObject secundario y deberían comenzar desde {no ""
fuente
si su formato y variables json están bien, verifique las consultas de su base de datos ... incluso si los datos se guardan en la base de datos correctamente, el problema real podría estar allí ... vuelva a verificar sus consultas e intente nuevamente .. Espero que ayude
fuente
No olvide convertir su objeto en Json primero usando Gson ()
Luego, puede convertirlo fácilmente en un objeto usando esta increíble biblioteca
fuente
Tuve un caso en el que leí de un archivo json escrito a mano. El json es perfecto. Sin embargo, ocurrió este error. Entonces escribo desde un objeto java a un archivo json, luego leo desde ese archivo json. las cosas estan bien. No pude ver ninguna diferencia entre el json escrito a mano y el del objeto java. Probado beyondCompare no ve ninguna diferencia. Finalmente noté que los dos tamaños de archivo son ligeramente diferentes, utilicé la herramienta winHex y detecté cosas adicionales. Entonces, la solución para mi situación es hacer una copia del buen archivo json, pegar el contenido en él y usar.
fuente