Java: analizar más de un objeto Json en una cadena

Estoy tratando de analizar una respuesta Json de mi servicio web. Recibo esta cadena de mi servidor web.

{"lon0":"30.13689","lat0":"-96.3331183333333"}{"lon1":"30.136965","lat1":"-96.33252"}{"lon2":"30.1370383333333","lat2":"-96.3319233333333"}

Lo coloco en una cadena llamada jsonStr... luego lo coloco en un objeto. Y consigue las cuerdas que necesito.

JSONObject jsonObj = new JSONObject(jsonStr);//place it into an object
String longitudecord = jsonObj.getString("lon0");//retrieve the lon0
String latitudecord = jsonObj.getString("lat0");

Cuando pruebo este código anterior, obtengo que el registro de longitud correcto es 30.13689 y el registro de latitud correcto es -96.3331183333333.

pero cuando ejecuto esto

    String longitudecord = jsonObj.getString("lon1");
String latitudecord = jsonObj.getString("lat1");

No obtengo la longitud y latitud correctas. Lanza una excepción. Así que no creo que esté tratando de obtener "lon1" y "lat1" correctamente.

Puede alguien ayudarme con esto?

***ACTUALIZACIÓN******* mi fragmento de código php...

    $counter = 0;
// read them back
$result = mysql_query( "SELECT * FROM locations" );
while( $data = mysql_fetch_assoc($result) ) {
$latFromDb = $data['latitude'];
$longFromDb = $data['longitude'];
$variable = array( 'lon'.$counter => "$longFromDb", 'lat'.$counter => "$latFromDb" );
    // One JSON for both variables
echo json_encode($variable);
$counter++;
}

¿Cómo podría devolver el formato jSon adecuado?

preguntado el 03 de mayo de 12 a las 15:05

Actualice su título a uno más descriptivo (cada cadena JSON utilizable tiene más de "{}"...) -

Recomendaría formar una cadena json como una matriz de objetos [{},{},...] -

¿Es esa cadena JSON válida? No estoy seguro... -

{}{} no es un JSON válido. Ver json.org -

JSON no válido. Parece que el usuario ha solicitado 4 lat/logs separados, y se agregan juntos en una sola cadena en lugar de formar una matriz. -

4 Respuestas

Parece que estás devolviendo 3 resultados separados. Entonces, algunas posibilidades...

  1. Forme la cadena en un JSONArray y analice eso...

    JSONArray jsonObj = new JSONArray("["+jsonStr.replaceAll("}{","},{")+"]");

    Luego itere a través de cada elemento secundario de la matriz para obtener la latitud/longitud.

  2. Divida la cadena devuelta en cadenas de resultados separadas y analícelas individualmente. Tal vez algo como esto...

    String[] results = jsonStr.replaceAll("}{","}}{{").split("}{");

    Tenga en cuenta que reemplazamos Todo primero para que podamos mantener el } y { al inicio/final de cada resultado.


Lo mejor sería arreglar el código de su servidor PHP. Básicamente solo necesitas un [ al principio, un ] al final, y , entre cada resultado. Creo que algo como esto podría hacerlo (corrija la sintaxis para mí, no soy un codificador de PHP).

    $counter = 0;
// read them back
$result = mysql_query( "SELECT * FROM locations" );
echo '[';
while( $data = mysql_fetch_assoc($result) ) {
if (&counter >= 1){
  echo ',';
}
$latFromDb = $data['latitude'];
$longFromDb = $data['longitude'];
$variable = array( 'lon'.$counter => "$longFromDb", 'lat'.$counter => "$latFromDb" );
    // One JSON for both variables
echo json_encode($variable);
$counter++;
}
echo ']';

Una vez que tengas eso, deberías poder decir new JSONArray(serverResult) y analizará todos sus resultados en una matriz JSON en la que puede iterar.

contestado el 03 de mayo de 12 a las 16:05

Probé el segundo y el primero y obtengo esta línea al depurar '05-03 14:45:10.452: E/AndroidRuntime(476): java.util.regex.PatternSyntaxException: error de sintaxis U_REGEX_RULE_SYNTAX cerca del índice 1: }{ '- Abdullah Rashid

Disculpas, tendrás que escapar de los personajes haciendo esto... replaceAll("\}\{","}}{{"). He editado mi respuesta. - wattostudios

Con su última actualización en Eclipse dice: Secuencia de escape no válida (las válidas son \b \t \n \f \r \" \' \\ ) - Abdullah Rashid

Joder, no pensé que { y } tuvieran que escaparse, así que me sorprendió tu comentario original. No estoy realmente seguro de qué tiene de malo :-( . Veo que ha editado su pregunta original con el código PHP; ¡definitivamente sería el enfoque correcto para solucionarlo allí! - wattostudios

Edité mi respuesta para incluir cambios de PHP que deberían hacer que sea JSON adecuado. - wattostudios

Su jsonStr no es válido, faltan corchetes y comas entre cada registro. Usar:

[
    {
        "lon0": "30.13689",
        "lat0": "-96.3331183333333"
    },
    {
        "lon1": "30.136965",
        "lat1": "-96.33252"
    },
    {
        "lon2": "30.1370383333333",
        "lat2": "-96.3319233333333"
    }
]

PHP:

$sth = mysql_query("SELECT latitude,longitude FROM locations");
$rows = array();
while($r = mysql_fetch_assoc($sth)) {
    $rows[] = $r;
}
echo json_encode($rows);

Esto debería generar el formato correcto.

contestado el 03 de mayo de 12 a las 16:05

¿Podrías ver mi ****Actualización****? Mi código php está ahí. Estoy tratando de descubrir cómo mostrarlos como usted ha dicho. - Abdullah Rashid

Echa un vistazo a esto aquí. Debe codificar la cadena como una matriz de objetos lon y lat. - ebraham

JSONObject solo tomará el primer JSON que figura en la cadena. Al hacer esto:

JSONObject jsonObj = new JSONObject(jsonStr);

su objeto terminará conteniendo el primer json:

{"lon0":"30.13689","lat0":"-96.3331183333333"}

Entonces, cuando intente obtener datos sobre otro objeto json, no encontrará la clave que especifique. Tendrás que analizar la cadena de alguna manera, creo que hacer algo como esto podría funcionar:

String separatedJsons= jsonStr.replace("}{", "}###{");
String jsons[] = separatedJsons.split("###");

De esa manera, termina con una matriz de cadenas, cada una con los json individuales. Puede crear sus JSONObjects con cada uno más tarde.

contestado el 03 de mayo de 12 a las 15:05

No estoy seguro de que la respuesta del servicio web tenga el formato JSON correcto, ¿cuál podría ser el problema?

Si tiene los medios para editar la cadena que genera su aplicación, puede intentar algo como lo siguiente:

[
{"lon0":"30.13689","lat0":"-96.3331183333333"},
{"lon1":"30.136965","lat1":"-96.33252"},
{"lon2":"30.1370383333333","lat2":"-96.3319233333333"}
]

contestado el 03 de mayo de 12 a las 15:05

¿Podrías ver mi Noticias, mi código php está ahí. Estoy tratando de descubrir cómo mostrarlos como usted ha dicho. - Abdullah Rashid

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.