socket - setvalueat jtable java
"Se esperaba BEGIN_OBJECT pero estaba STRING en la línea 1, columna 1" (9)
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 estaba STRING en la línea 1 columna 1
Asegúrese de tener objetos DESERIALIZADOS como DATE / DATETIME, etc. Si envía directamente JSON sin deserializarlo, puede causar este problema.
El 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 en el lado del cliente es
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
//...
Si desea saber por qué el JSON que recibió del servidor es incorrecto, puede mirar dentro de su bloque catch con la excepción. Pero incluso si es su problema, no es responsabilidad del cliente arreglar el JSON que recibe de Internet.
De cualquier manera, es responsabilidad del cliente decidir qué hacer cuando se pone mal JSON. Dos posibilidades son rechazar el JSON y no hacer nada, y volver a intentarlo.
Si va a intentarlo de nuevo, le recomiendo configurar una bandera dentro del bloque try / catch y luego responder a esa bandera fuera del bloque try / catch. Probablemente, Try / catch anidado es la forma en que Gson nos metió en este lío con nuestro seguimiento de pila y las excepciones no coinciden.
En otras palabras, aunque admito que no se ve muy elegante, recomendaría
boolean failed = false;
try
{
gson.fromJSON(ad, Ad.class);
//...
}
catch (IllegalStateException | JsonSyntaxException exception)
{
failed = true;
//...
}
if (failed)
{
//...
En Retrofit2, cuando desee enviar sus parámetros en bruto, debe usar Scalars.
primero agrega esto en tu gradle:
compile ''com.squareup.retrofit2:retrofit:2.3.0''
compile ''com.squareup.retrofit2:converter-gson:2.3.0''
compile ''com.squareup.retrofit2:converter-scalars:2.3.0''
public interface ApiInterface {
String URL_BASE = "http://10.157.102.22/rest/";
@Headers("Content-Type: application/json")
@POST("login")
Call<User> getUser(@Body String body);
}
my SampleActivity:
public class SampleActivity extends AppCompatActivity implements Callback<User> {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiInterface.URL_BASE)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
// prepare call in Retrofit 2.0
try {
JSONObject paramObject = new JSONObject();
paramObject.put("email", "[email protected]");
paramObject.put("pass", "4384984938943");
Call<User> userCall = apiInterface.getUser(paramObject.toString());
userCall.enqueue(this);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onResponse(Call<User> call, Response<User> response) {
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
}
Referencia: [ ¿Cómo PUBLICAR todo JSON sin procesar en el cuerpo de una solicitud de modificación?
En mi caso, estoy devolviendo el objeto JSON como
{"data": "", "message": "Asistencia guardada con éxito .. !!!", "status": "success"}
Resuelto cambiándolo como
{"datos": {}, "mensaje": "Asistencia guardada con éxito .. !!!", "estado": "éxito"}
Aquí los datos son un sub JsonObject y deben comenzar desde {no ""
He venido a compartir una solución.
El error me sucedió después de forzar al notbook a colgar.
posible solución
clean preject
.
Incluso sin ver su cadena JSON, puede ver en el mensaje de error que no es la estructura correcta para analizar en una instancia de su clase.
Gson espera que su cadena JSON comience con un objeto que abra la llave. p.ej
{
Pero la cadena que le has pasado comienza con comillas abiertas
"
No use
jsonObject.toString
en un objeto JSON.
Tal vez su
JSON Object
sea correcto, pero la respuesta que recibió no es su información válida. Al igual que cuando conecta el
WiFi
no válido, puede recibir una respuesta extraña
< html>.....< /html>
que
GSON
no puede analizar gramaticalmente.
puede que tenga que
try..catch..
para que esta extraña respuesta evite el bloqueo.
si su formato json y las variables están bien, verifique las consultas de su base de datos ... incluso si los datos se guardan en db correctamente, el problema real podría estar allí ... vuelva a verificar sus consultas e intente nuevamente. Espero que ayude