2012-08-08 18 views
40

Estoy tratando de analizar una cadena JSON en Java para que el valor individual se imprima por separado. Pero al tiempo que la ejecución del programa me sale el siguiente de erroresAnalizando cadenas JSON en Java

Exception in thread "main" java.lang.RuntimeException: Stub! 
     at org.json.JSONObject.<init>(JSONObject.java:7) 
     at ShowActivity.main(ShowActivity.java:29) 

mi clase se ve como-

import org.json.JSONException; 
import org.json.JSONObject; 

public class ShowActivity { 
    private final static String jString = "{" 
    + " \"geodata\": [" 
    + "  {" 
    + "    \"id\": \"1\"," 
    + "    \"name\": \"Julie Sherman\","     
    + "    \"gender\" : \"female\"," 
    + "    \"latitude\" : \"37.33774833333334\"," 
    + "    \"longitude\" : \"-121.88670166666667\""    
    + "    }" 
    + "  }," 
    + "  {" 
    + "    \"id\": \"2\"," 
    + "    \"name\": \"Johnny Depp\","   
    + "    \"gender\" : \"male\"," 
    + "    \"latitude\" : \"37.336453\"," 
    + "    \"longitude\" : \"-121.884985\""    
    + "    }" 
    + "  }" 
    + " ]" 
    + "}"; 
    private static JSONObject jObject = null; 

    public static void main(String[] args) throws JSONException { 
     jObject = new JSONObject(jString); 
     JSONObject geoObject = jObject.getJSONObject("geodata"); 

     String geoId = geoObject.getString("id"); 
      System.out.println(geoId); 

     String name = geoObject.getString("name"); 
     System.out.println(name); 

     String gender=geoObject.getString("gender"); 
     System.out.println(gender); 

     String lat=geoObject.getString("latitude"); 
     System.out.println(lat); 

     String longit =geoObject.getString("longitude"); 
     System.out.println(longit);     
    } 
} 

hacérmelo saber que es lo que me falta, o la razón por la que hago conseguir que el error cada vez que ejecuto la aplicación. Cualquier comentario será bienvenido.

+2

'android.jar' solo contiene stubs para compilar en contra. Para ejecutar, necesitas la biblioteca completa. – oldrinb

+0

Sí, importé 'android.jar' en mi proyecto. ¿Puede indicarme dónde puedo descargar la biblioteca completa? – AKIWEB

Respuesta

55

Ver mi comment. Necesita incluir el org.json library completo cuando se ejecuta como android.jar solo contiene stubs para compilar.

Además, debe eliminar las dos instancias de } adicionales en sus datos JSON después de longitude.

private final static String JSON_DATA = 
    "{" 
    + " \"geodata\": [" 
    + " {" 
    + "  \"id\": \"1\"," 
    + "  \"name\": \"Julie Sherman\","     
    + "  \"gender\" : \"female\"," 
    + "  \"latitude\" : \"37.33774833333334\"," 
    + "  \"longitude\" : \"-121.88670166666667\"" 
    + " }," 
    + " {" 
    + "  \"id\": \"2\"," 
    + "  \"name\": \"Johnny Depp\","   
    + "  \"gender\" : \"male\"," 
    + "  \"latitude\" : \"37.336453\"," 
    + "  \"longitude\" : \"-121.884985\"" 
    + " }" 
    + " ]" 
    + "}"; 

Aparte de eso, geodata no es de hecho un JSONObject sino un JSONArray.

Este es el código totalmente funcional y probado corregido:

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

public class ShowActivity { 


    private final static String JSON_DATA = 
    "{" 
    + " \"geodata\": [" 
    + " {" 
    + "  \"id\": \"1\"," 
    + "  \"name\": \"Julie Sherman\","     
    + "  \"gender\" : \"female\"," 
    + "  \"latitude\" : \"37.33774833333334\"," 
    + "  \"longitude\" : \"-121.88670166666667\"" 
    + " }," 
    + " {" 
    + "  \"id\": \"2\"," 
    + "  \"name\": \"Johnny Depp\","   
    + "  \"gender\" : \"male\"," 
    + "  \"latitude\" : \"37.336453\"," 
    + "  \"longitude\" : \"-121.884985\"" 
    + " }" 
    + " ]" 
    + "}"; 

    public static void main(final String[] argv) throws JSONException { 
    final JSONObject obj = new JSONObject(JSON_DATA); 
    final JSONArray geodata = obj.getJSONArray("geodata"); 
    final int n = geodata.length(); 
    for (int i = 0; i < n; ++i) { 
     final JSONObject person = geodata.getJSONObject(i); 
     System.out.println(person.getInt("id")); 
     System.out.println(person.getString("name")); 
     System.out.println(person.getString("gender")); 
     System.out.println(person.getDouble("latitude")); 
     System.out.println(person.getDouble("longitude")); 
    } 
    } 
} 

Aquí está la salida:

C:\dev\scrap>java -cp json.jar;. ShowActivity 
1 
Julie Sherman 
female 
37.33774833333334 
-121.88670166666667 
2 
Johnny Depp 
male 
37.336453 
-121.884985 
+0

Gracias veer. Abrí ese enlace pero no pude encontrar el archivo jar para descargar. ¿Puede indicarme la ubicación exacta desde donde puedo descargarlo? – AKIWEB

+3

@ Nevzz03 try [aquí] (http://repo1.maven.org/maven2/org/json/json/20090211/json-20090211.jar). – oldrinb

+0

Lo hice según su sugerencia. Descargué el tarro también, importado en nuestro proyecto también. Y cuando ejecuté mi proyecto, obtuve una excepción como: 'Exception in thread" main "org.json.JSONException: JSONObject [" geodata "] no es un JSONObject. \t en org.json.JSONObject.getJSONObject (JSONObject.java:596) \t en com.niharika.testing.JsonTest.main (JsonTest.java:31) 'Se apreciará Cualquier pensamiento. – AKIWEB

-2

corrígeme si me equivoco, pero JSON es sólo de texto separados por ":", por lo que sólo tiene que utilizar

String line = ""; //stores the text to parse. 

StringTokenizer st = new StringTokenizer(line, ":"); 
String input1 = st.nextToken(); 

seguir usando st.nextToken() hasta que esté fuera de los datos. Asegúrese de usar "st.hasNextToken()" para que no obtenga una excepción nula.

+2

Consulte información sobre json en http://www.json.org/ –

+0

OP está buscando una forma de analizar la cadena json de la manera más eficiente –

3

Parece que para sus dos objetos (dentro del conjunto), tiene un corchete de cierre adicional después de "Longitud".

0

que tienen un extra "}" en cada objeto, puede escribir la cadena JSON como esto:

public class ShowActivity { 
    private final static String jString = "{" 
    + " \"geodata\": [" 
    + "  {" 
    + "    \"id\": \"1\"," 
    + "    \"name\": \"Julie Sherman\","     
    + "    \"gender\" : \"female\"," 
    + "    \"latitude\" : \"37.33774833333334\"," 
    + "    \"longitude\" : \"-121.88670166666667\""    
    + "    }" 
    + "  }," 
    + "  {" 
    + "    \"id\": \"2\"," 
    + "    \"name\": \"Johnny Depp\","   
    + "    \"gender\" : \"male\"," 
    + "    \"latitude\" : \"37.336453\"," 
    + "    \"longitude\" : \"-121.884985\""    
    + "    }" 
    + "  }" 
    + " ]" 
    + "}"; 
} 
+0

@ Nevzz03 puede usar [enlace] (http: //flexjson.sourceforge .net /) flexjson java lib para crear su objeto json en su lugar. –

1

En primer lugar no es un extra } después de cada array object.

En segundo lugar "geodata" es un JSONArray. Así que en lugar de JSONObject geoObject = jObject.getJSONObject("geodata"); usted tiene que conseguir como JSONArray geoObject = jObject.getJSONArray("geodata");

vez que tenga el JSONArray se puede recuperar cada entrada en la JSONArray usando geoObject.get(<index>).

Estoy usando org.codehaus.jettison.json.

0

Aquí está el ejemplo de un objeto. Para su caso, debe usar JSONArray.

public static final String JSON_STRING="{\"employee\":{\"name\":\"Sachin\",\"salary\":56000}}"; 
try{ 
    JSONObject emp=(new JSONObject(JSON_STRING)).getJSONObject("employee"); 
    String empname=emp.getString("name"); 
    int empsalary=emp.getInt("salary"); 

    String str="Employee Name:"+empname+"\n"+"Employee Salary:"+empsalary; 
    textView1.setText(str); 

}catch (Exception e) {e.printStackTrace();} 
    //Do when JSON has problem. 
} 

No tengo tiempo pero traté de dar una idea. Si todavía no puede hacerlo, entonces lo ayudaré.