2011-06-10 14 views
7

Análisis JSON parece ser un tema de discusión bastante común aquí. He mirado alrededor y todavía no he encontrado lo que estoy buscando. Aquí está mi código para mi HttpClientAnálisis de cadena JSON en Android

public class CreateJsonRequest { 


    public static String SendJsonRequest(String URL, Map<String,Object> params){ 
      try{ 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(URL); 

       JSONObject holder = new JSONObject(); 

       for (Map.Entry<String, Object> m : params.entrySet()){ 
        try { 
         holder.put(m.getKey(), m.getValue()); 
        } 
        catch (JSONException e) { 
         Log.e("Hmmmm", "JSONException : "+e); 
        } 
       } 
       StringEntity se; 
       se = new StringEntity(holder.toString()); 

       httpPost.setEntity(se); 
       httpPost.setHeader("Accept", "text/json"); 
       httpPost.setHeader("Content-type", "text/json"); 

       HttpResponse response = httpClient.execute(httpPost); 
       HttpEntity entity = response.getEntity(); 

       if(entity != null){ 
        final JSONObject respObject = new JSONObject(EntityUtils.toString(entity)); 
        String result = respObject.toString();  
        parseJSON(result); 

estoy usando un HttpClient para enviar una petición a un servidor JSON. El servidor luego devuelve una respuesta en JSON. Esto funciona genial Ahora aquí es donde estoy teniendo problemas. Recibo una HttpEntity del servidor. Estoy convirtiendo eso en una cadena que se ve así. {"Make":"Ford","Year": 1975, "Model":"Mustang"} Deseo poder enviar esta cadena a mi método parseJSON(String jString) y devolver un mapa de valores clave. Donde siento que esto difiere de otras publicaciones es que quiero que el método de análisis pueda crear un mapa de valores clave para cualquier cadena JSON que le envíe. Si lo enviara {"Engine":"v8","Cylinders": 8, "Transmission":"Manual","Gears": 4}, seguiría funcionando. ¿Es esto factible? Y si es así, ¿podría darme algunos empujones en la dirección correcta?

+0

intente utilizar la biblioteca GSON de Google, ¡es increíble! – binnyb

+0

Esto no es 'Android', ¿verdad? ¿O me estoy perdiendo algo? Parece completamente irrelevante que lo uses en una aplicación de Android. – keyser

Respuesta

20

En este caso, puede utilizar el método keys de la clase JSONObject. Básicamente, se devuelve un Iterator de las claves, que luego se puede repetir para obtener y poner los valores en un mapa:

try { 
    JSONObject jsonObject = new JSONObject(theJsonString); 
    Iterator keys = jsonObject.keys(); 
    Map<String, String> map = new HashMap<String, String>(); 
    while (keys.hasNext()) { 
     String key = (String) keys.next(); 
     map.put(key, jsonObject.getString(key)); 
    } 
    System.out.println(map);// this map will contain your json stuff 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 
+0

Ah ... Ni siquiera pensé en eso. Todos los ejemplos que vi usaban claves conocidas ... sí, eso debería funcionar. Lo intentaré un poco. ¡Gracias! –

+0

Funcionó perfectamente. Muchas gracias. –

+0

@ michaelw2608 - Agradézcalo con un voto positivo ... – tpow

1

Tenga en cuenta que Jackson puede deserializar cualquiera de los dos ejemplos JSON de manera muy sencilla.

ObjectMapper mapper = new ObjectMapper(); 
Map<String, Object> values = mapper.readValue(theJsonString, Map.class); 

Gson puede hacerlo de manera similar simplemente si está satisfecho con un Map<String, String>, en lugar de un Map<String, Object>. Actualmente, Gson necesitaría deserialización personalizada para un Map<String, Object>.