2011-08-17 15 views
15

Tengo un List<class> que me gustaría convertir en un objeto JSON y luego atravesar los datos fuera del objeto JSON.¿Cómo poner una lista <class> en un JSONObject y luego leer ese objeto?

Si esto fuera sólo una list<String> tan sólo pudiera hacer algo como:

JSONObject obj = new JSONObject(); 
List<String> sList = new ArrayList<String>(); 
sList.add("val1"); 
sList.add("val2"); 

obj.put("list", sList); 

entonces podría atravesar la lista como:

JSONArray jArray = obj.getJSONArray("list"); 
for(int ii=0; ii < jArray.size(); ii++ 
    System.out.println(jArray.getString(ii)); 

El problema de usar la clase es que necesito tener acceso a los datos dentro de cada elemento de la clase de mi list<class> y no sé cómo codificar que/travesaño en JSON. Cualquier ayuda sería muy apreciada.

+2

¿Qué clase de 'JSONObject' estás usando? Hay algunos ... – andyb

+0

Buen punto, había asumido que eran las clases org.json. –

Respuesta

15

llamada getJSONObject() en lugar de getString(). Eso le dará un control sobre el objeto JSON en la matriz y luego podrá sacar la propiedad del objeto desde allí.

Por ejemplo, para obtener el "valor" propiedad de un List<SomeClass> donde SomeClass tiene un String getValue() y setValue(String value):

JSONObject obj = new JSONObject(); 
List<SomeClass> sList = new ArrayList<SomeClass>(); 

SomeClass obj1 = new SomeClass(); 
obj1.setValue("val1"); 
sList.add(obj1); 

SomeClass obj2 = new SomeClass(); 
obj2.setValue("val2"); 
sList.add(obj2); 

obj.put("list", sList); 

JSONArray jArray = obj.getJSONArray("list"); 
for(int ii=0; ii < jArray.length(); ii++) 
    System.out.println(jArray.getJSONObject(ii).getString("value")); 
+0

¡Esto es exactamente lo que estaba buscando gracias! – Grammin

+0

no funcionan para mí. No puedo analizar matriz desde jsonObject. JSONArray jArray = obj.getJSONArray ("lista"); me dará una excepción. JSONArray list = new JSONArray (iconIds); obj.put ("lista", lista); Esto funciona. Puedo analizar array desde obj JSONArray jArray = obj.getJSONArray ("list"); – fangzhzh

1

Se puede usar un serializador JSON/deserializer como flexjson para hacer la conversión para usted.

+0

Gracias por la sugerencia, pero me gustaría evitar el uso de un serializador a toda costa si puedo. – Grammin

+0

De acuerdo, ya que quiere seguir con JSONArray y JSONObject, proporcioné una respuesta alternativa. –

1

Así es como lo hago a través de Google Gson. No estoy seguro si hay una forma más sencilla de hacerlo (con o sin una biblioteca externa).

Type collectionType = new TypeToken<List<Class>>() { 
       } // end new 
         .getType(); 

       String gsonString = 
       new Gson().toJson(objList, collectionType); 
3

Vamos a suponer que la clase es datos con dos objetos nombre y DOB que son ambas cadenas .

Inicialmente, verifique si la lista está vacía. A continuación, agregue los objetos de la lista a un JSONArray

JSONArray allDataArray = new JSONArray(); 
List<Data> sList = new ArrayList<String>(); 

    //if List not empty 
    if (!(sList.size() ==0)) { 

     //Loop index size() 
     for(int index = 0; index < sList.size(); index++) { 
      JSONObject eachData = new JSONObject(); 
      try { 
       eachData.put("name", sList.get(index).getName()); 
       eachData.put("dob", sList.get(index).getDob()); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      allDataArray.put(eachData); 
     } 
    } else { 
     //Do something when sList is empty 
    } 

Por último, añadir el JSONArray a un JSONObject.

JSONObject root = new JSONObject(); 
    try { 
     root.put("data", allDataArray); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

Puede obtener más estos datos como una cadena también.

String jsonString = root.toString(); 
+0

Buena explicación, solucionó mi problema. –

0

Sólo para actualizar este hilo, aquí es cómo agregar una lista (como una matriz JSON) en JSONObject. Plz sustituye YourClass con su nombre de clase;

List<YourClass> list = new ArrayList<>(); 
JSONObject jsonObject = new JSONObject(); 

org.codehaus.jackson.map.ObjectMapper objectMapper = new 
org.codehaus.jackson.map.ObjectMapper(); 
org.codehaus.jackson.JsonNode listNode = objectMapper.valueToTree(list); 
org.json.JSONArray request = new org.json.JSONArray(listNode.toString()); 
jsonObject.put("list", request); 
Cuestiones relacionadas