Análisis de cadena JSON en Java

Estoy tratando de analizar una cadena JSON en Java para que el valor individual se imprima por separado. Pero mientras ejecuta el progtwig me sale el siguiente error-

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

Mi clase parece …

 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); } } 

Avíseme qué es lo que me falta, o la razón por la que obtengo ese error cada vez que ejecuto la aplicación. Cualquier comentario será bienvenido.

Ver mi comentario Necesita incluir la biblioteca org.json completa cuando se ejecuta, ya que android.jar solo contiene stubs para comstackr.

Además, debe eliminar las dos instancias de extra } en sus datos JSON después de la 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, los geodata son, en realidad, un JSONObject sino un JSONArray .

Aquí está el código corregido completamente funcional y probado:

 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á el resultado:

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

Parece que para sus dos objetos (dentro del conjunto), tiene un refuerzo adicional después de “Longitud”.

En primer lugar, hay un extra } después de cada array object .

En segundo lugar, “geodata” es un JSONArray . Entonces, en lugar de JSONObject geoObject = jObject.getJSONObject("geodata"); tienes que obtenerlo como JSONArray geoObject = jObject.getJSONArray("geodata");

Una vez que tenga JSONArray , puede buscar cada entrada en JSONArray usando geoObject.get() .

Estoy usando org.codehaus.jettison.json .

Para convertir su cadena JSON a hashmap , puede hacer uso de esto:

 HashMap hashMap = new HashMap<>(Utility.jsonToMap(response)) ; 

Use esta clase 🙂 (maneja listas pares, listas anidadas y json)

 public class Utility { public static Map jsonToMap(Object json) throws JSONException { if(json instanceof JSONObject) return _jsonToMap_((JSONObject)json) ; else if (json instanceof String) { JSONObject jsonObject = new JSONObject((String)json) ; return _jsonToMap_(jsonObject) ; } return null ; } private static Map _jsonToMap_(JSONObject json) throws JSONException { Map retMap = new HashMap(); if(json != JSONObject.NULL) { retMap = toMap(json); } return retMap; } private static Map toMap(JSONObject object) throws JSONException { Map map = new HashMap(); Iterator keysItr = object.keys(); while(keysItr.hasNext()) { String key = keysItr.next(); Object value = object.get(key); if(value instanceof JSONArray) { value = toList((JSONArray) value); } else if(value instanceof JSONObject) { value = toMap((JSONObject) value); } map.put(key, value); } return map; } public static List toList(JSONArray array) throws JSONException { List list = new ArrayList(); for(int i = 0; i < array.length(); i++) { Object value = array.get(i); if(value instanceof JSONArray) { value = toList((JSONArray) value); } else if(value instanceof JSONObject) { value = toMap((JSONObject) value); } list.add(value); } return list; } } 

tiene un ” } ” adicional en cada objeto, puede escribir la cadena json de esta manera:

 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\"" + " }" + " }" + " ]" + "}"; } 

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é.

Corrígeme si estoy equivocado, pero json es texto separado por “:”, así que solo usa

 String line = ""; //stores the text to parse. StringTokenizer st = new StringTokenizer(line, ":"); String input1 = st.nextToken(); 

sigue usando st.nextToken () hasta que te quedes sin datos. Asegúrese de usar “st.hasNextToken ()” para que no obtenga una excepción nula.