2010-08-03 18 views
109

Czy istnieje sposób konwertowania JSON Array na normalny Java Array dla powiązania danych Android ListView?Konwertuj Json Array na normalny Java Array

+6

Zabawne jest to, że 'org.JSONArray' używa ArrayList pod maską ...'TablicaList, w której przechowywane są właściwości JSONArray', więc większość pętli jest wykonywana dla niczego w wielu przypadkach (tylko dla enkapsulacji) –

Odpowiedz

159
ArrayList<String> list = new ArrayList<String>();  
JSONArray jsonArray = (JSONArray)jsonObject; 
if (jsonArray != null) { 
    int len = jsonArray.length(); 
    for (int i=0;i<len;i++){ 
    list.add(jsonArray.get(i).toString()); 
    } 
} 
+5

dla pętli brakuje nawiasu zamykającego ... wypróbowana edycja, ale nie wystarcza znaków do zatwierdzenia. No cóż! tylko FYI. –

+0

itz właściwie nie brakuje, odpowiadający właśnie wkleił fragment kodu z klamrami otwierającymi i zamykającymi tej funkcji. –

+0

Co się stanie, jeśli 'jsonArray.get (i)' zwróci wartość null (w wyniku parsowania tego: '[" String 1 ", null," String 2 "]')? Czy to nie byłaby twoja awaria dla pętli? – dbm

53

Jeżeli nie masz jeszcze obiekt JSONArray, zadzwoń

JSONArray jsonArray = new JSONArray(jsonArrayString); 

pętlę po prostu przez to, budując swoją tablicę. Ten kod zakłada, że ​​jest to tablica łańcuchów, więc nie powinno być trudniej modyfikować, aby pasowała do konkretnej struktury macierzy.

List<String> list = new ArrayList<String>(); 
for (int i=0; i<jsonArray.length(); i++) { 
    list.add(jsonArray.getString(i)); 
} 
+5

.size() powinno być .length() – vaskin

+2

Przepraszam, masz rację - jestem mylące Listy z JSONArrays :) Jest rzeczywiście JSONArray.length(). – Nick

+1

dziękuję, pomogło ..: D – andikurnia

-3

Co powiesz na używanie java.util.Arrays?

List<String> list = Arrays.asList((String[])jsonArray.toArray()) 
+0

Wsporniki nie pasują i to nie działa dla mnie. – yingted

+14

Nie widzę metody 'toArray()' w dokumentacji 'JSONArray()'. http://www.json.org/javadoc/org/json/JSONArray.html To pytanie prawdopodobnie nie zostałoby zadane, gdyby istniało proste 'toArray()'. – javajavajavajavajava

+0

net.sf.json.JSONArray ma metodę toArray(), więc ta odpowiedź działa dla tej biblioteki JSON. Pytanie nie określało używanej biblioteki. – ilinca

6

Może to tylko obejście (nie bardzo wydajny), ale można zrobić coś takiego:

String[] resultingArray = yourJSONarray.join(",").split(",");

Oczywiście można zmienić „,” separator cokolwiek chcesz (miałem a JSONArray adresów e-mail)

+5

Należy pamiętać, że należy bezwzględnie upewnić się, że dane nie zawierają znaku separatora, w przeciwnym razie wystąpią uszkodzone dane. – Artemix

+1

, a wynik musi być łańcuchem. –

+0

Jedna wkładka, idealna. – zeeshan

0

Wiem, że to pytanie dotyczy JSONArray, ale oto przykład, który uznałem za przydatny tam, gdzie nie trzeba używać JSONArray do wyodrębniania obiektów z JSONObject.

import org.json.simple.JSONObject; 
import org.json.simple.JSONValue; 

String jsonStr = "{\"types\":[1, 2]}"; 
JSONObject json = (JSONObject) JSONValue.parse(jsonStr); 
List<Long> list = (List<Long>) json.get("types"); 
if (list != null) { 
    for (Long s : list) { 
     System.out.println(s); 
    } 
} 

współpracuje również z tablicy ciągów

0

Tutaj jest lepszy sposób to zrobić: jeśli otrzymujesz dane z API. Następnie analizowania JSON i ładowania go na swoim ListView:

protected void onPostExecute(String result) { 
       Log.v(TAG + " result); 


       if (!result.equals("")) { 

        // Set up variables for API Call 
        ArrayList<String> list = new ArrayList<String>(); 

        try { 
         JSONArray jsonArray = new JSONArray(result); 

         for (int i = 0; i < jsonArray.length(); i++) { 

          list.add(jsonArray.get(i).toString()); 

         }//end for 
        } catch (JSONException e) { 
         Log.e(TAG, "onPostExecute > Try > JSONException => " + e); 
         e.printStackTrace(); 
        } 


        adapter = new ArrayAdapter<String>(ListViewData.this, android.R.layout.simple_list_item_1, android.R.id.text1, list); 
        listView.setAdapter(adapter); 
        listView.setOnItemClickListener(new OnItemClickListener() { 
         @Override 
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

          // ListView Clicked item index 
          int itemPosition = position; 

          // ListView Clicked item value 
          String itemValue = (String) listView.getItemAtPosition(position); 

          // Show Alert 
          Toast.makeText(ListViewData.this, "Position :" + itemPosition + " ListItem : " + itemValue, Toast.LENGTH_LONG).show(); 
         } 
        }); 

        adapter.notifyDataSetChanged(); 


         adapter.notifyDataSetChanged(); 

... 
6

Zamiast dołączone w org.json biblioteki, spróbuj użyć Jacksona lub GSON, gdzie jest to jedno-liner. Z Jackson, f.ex:

List<String> list = new ObjectMapper().readValue(json, List.class); 
// Or for array: 
String[] array = mapper.readValue(json, String[].class); 
2

stosowanie może użyć String[] zamiast ArrayList<String>:

To zmniejszy obciążenie pamięci, który ArrayList ma

Nadzieję, że to pomaga!

String[] stringsArray = new String[jsonArray.length()]; 
for (int i = 0; i < jsonArray.length; i++) { 
    parametersArray[i] = parametersJSONArray.getString(i); 
} 
0

my począwszy od konwersji [JSONArray -> Lista < JSONObject>]

public static List<JSONObject> getJSONObjectListFromJSONArray(JSONArray array) 
     throws JSONException { 
    ArrayList<JSONObject> jsonObjects = new ArrayList<>(); 
    for (int i = 0; 
      i < (array != null ? array.length() : 0);   
      jsonObjects.add(array.getJSONObject(i++)) 
     ); 
    return jsonObjects; 
} 

obok stworzyć generyczną wersję zastępując array.getJSONObject (i ++) z POJO

przykład:

public <T> static List<T> getJSONObjectListFromJSONArray(Class<T> forClass, JSONArray array) 
     throws JSONException { 
    ArrayList<Tt> tObjects = new ArrayList<>(); 
    for (int i = 0; 
      i < (array != null ? array.length() : 0);   
      tObjects.add((T) createT(forClass, array.getJSONObject(i++))) 
     ); 
    return tObjects; 
} 

private static T createT(Class<T> forCLass, JSONObject jObject) { 
    // instantiate via reflection/use constructor or whatsoever 
    T tObject = forClass.newInstance(); 
    // if not using constuctor args fill up 
    // 
    // return new pojo filled object 
    return tObject; 
} 
0

Możesz użyć numeru String[] zamiast ArrayList<String>:

Mam nadzieję, że pomoże!