2011-08-17 9 views
15

Mam List<class>, które chciałbym przekonwertować na obiekt json, a następnie przechodzić dane z obiektu Json.Jak umieścić listę <class> w obiekcie JSONObject, a następnie odczytać ten obiekt?

Gdyby to było tylko list<String> może po prostu zrobić coś takiego:

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

obj.put("list", sList); 

Wtedy mogłem przemierzać listę:

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

Problem z pomocą klasy jest to, że muszę mieć dostęp do danych w każdym elemencie klasy mojego list<class> i nie wiem jak to zakodować/przejść do JSON. Każda pomoc będzie wielce ceniona.

+2

Którą klasę "JSONObject' używasz? Jest kilka ... – andyb

+0

Dobrze, założyłem, że to klasy org.json. –

Odpowiedz

15

połączeń getJSONObject() zamiast getString(). To da ci uchwyt obiektu JSON w tablicy, a następnie możesz odjąć własność od obiektu.

Na przykład, aby uzyskać „wartość” własność od A List<SomeClass> gdzie SomeClass ma String getValue() i 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

To jest dokładnie to, czego szukałem, dziękuję! – Grammin

+0

nie działają dla mnie. Nie mogę sparsować tablicy z jsonObject. JSONArray jArray = obj.getJSONArray ("lista"); da mi wyjątek. JSONArray list = new JSONArray (iconIds); obj.put ("lista", lista); To działa. Mogę parsować tablicę z obj JSONArray jArray = obj.getJSONArray ("list"); – fangzhzh

1

Możesz użyć serializatora/deserializatora JSON, takiego jak flexjson, aby wykonać konwersję.

+0

Dziękuję za sugestię, ale chciałbym uniknąć używania serializatora za wszelką cenę, jeśli mogę. – Grammin

+0

OK, ponieważ chcesz trzymać się JSONArray i JSONObject, dostarczyłem alternatywną odpowiedź. –

1

Tak to robię za pomocą Google Gson. Nie jestem pewien, czy jest to prostszy sposób (z biblioteką zewnętrzną lub bez niej).

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

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

Załóżmy, że klasa jest danych z dwóch obiektów nazwa i dob, które są ciągi.

Najpierw sprawdź, czy lista jest pusta. Następnie dodać obiekty z listy do 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 
    } 

Wreszcie dodać JSONArray do JSONObject.

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

można dodatkowo uzyskać te dane jako String też.

String jsonString = root.toString(); 
+0

Dobre wyjaśnienie, rozwiązałem mój problem. –

0

Wystarczy zaktualizować ten wątek, tutaj jest to, jak dodać listę (jako tablicy json) do JSONObject. Plz zastąpić YourClass swoją nazwą klasy;

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); 
Powiązane problemy