2012-08-29 21 views
17

Voglio analizzare il mio array Json in modo dinamico. e voglio ottenere una serie di KEY per ogni elemento sotto jsonarray. ho ottenuto questo attraverso iteratore. ma non ottenendo il sequestro come per l'output json formate.ottieni un array di KEY per ogni elemento sotto jsonarray

mia JSON formiato:

{ 
    "result": "Success", 
    "AlertDetails": [ 
    { 
     "ShipmentNumber": "SHP34", 
     "Customer": "BEST", 
     "DateCreated": "2012-08-29T04:59:18Z" 
     "CustomerName": "BEST" 
    }, 
    { 
     "ShipmentNumber": "SHP22", 
     "Customer": "BEST", 
     "DateCreated": "2012-08-29T05:34:18Z" 
     "CustomerName": "Jelly" 
    } 
    ] 
} 

Ecco il mio codice:

JSONArray array = jsonobject.getJSONArray("AlertDetails"); 

    JSONObject keyarray = array.getJSONObject(0); 
    Iterator temp = keyarray.keys(); 
     while (temp.hasNext()) { 
        String curentkey = (String) temp.next(); 
        KEYS.add(curentkey); 

    } 
Log.d("Parsing Json class", " ---- KEYS---- " + KEYS); 

cosa sto ottenendo in uscita logcate:

---- KEYS---- [DateCreated,CustomerName, Customer, ShipmentNumber] 

quello che voglio:

---- KEYS---- [ShipmentNumber, Customer, DateCreated,CustomerName] 
+0

è KEYS un arrayList? –

+0

@LazyNinja no è solo un nome. –

+0

@LazyNinja Sì, è un arraylist. puoi per favore aiutarmi a uscire da questo? Sarebbe fantastico se mi dai suggerimenti per questo problema. –

risposta

12

La documentazione JSONObject (link: http://developer.android.com/reference/org/json/JSONObject.html) ha la seguente descrizione per la funzione keys():

chiavi Iterator pubblico()

Dal: API Level 1

Restituisce un iteratore dei nomi String in questo oggetto. L'iteratore restituito supporta remove, che rimuoverà il mapping corrispondente da questo oggetto. Se questo oggetto viene modificato dopo che l'iteratore è restituito, il comportamento dell'iteratore non è definito. L'ordine dei tasti non è definito.

Quindi è possibile ottenere le chiavi ma l'ordine non è definito. È possibile utilizzare uno qualsiasi degli algoritmi di ordinamento se si desidera che le chiavi siano in un ordine particolare.

EDIT

Dal momento che non sono a conoscenza dell'ordine di chiavi che si stanno ottenendo dalla WS, dopo aver ricevuto i dati che si possono vedere i dettagli sullo schermo in un formato ordinato. Dopo la costruzione del arraylistKEYS, è possibile ordinare alfabeticamente esso utilizzando il seguente:

Collections.sort(KEYS); 

Questa ordinerà il Strings nella KEYSarraylist secondo la sua ordinamento naturale (che è alfabetico).

+1

Thnx per il tuo supporto. mi puoi suggerire qualche algoritmo per risolvere questo problema e questo può darmi l'Arraylist che ha lo stesso ordine KEYS che sto ricevendo in Response from WS? –

3

C'è anche il metodo names();

restituisce una matrice contenente i nomi di stringa di questo oggetto.

Modifica: restituisce i nomi in ordine non definito.Suggerimenti: analizzare da soli

+0

sì hai ragione. Ho anche provato, ma mi sta dando anche lo stesso ordine indefinito di CHIAVI che sto usando con il metodo key(). sarebbe molto pieno se hai altri suggerimenti per risolvere questo problema. –

+0

Quindi ti suggerisco di analizzarlo da solo –

6

Ho appena venuto a sapere quando premo ctlr + barra spaziatrice, in cui il suo scritto chiaramente che il comportamento delle chiavi non è definito, gli ordini non è mantenere con chiavi.

enter image description here

Arun George detto @ correttamente che si deve utilizzare alcun metodo di ordinamento per raggiungere il tuo obiettivo.

e per l'ordinamento può essere questo link ti aiuterà.

+5

Questo dovrebbe essere un commento alla risposta di George ... e non una risposta .. – MKJParekh

4

Utilizzare una libreria diversa per analizzare json in modo dinamico.

Qui di seguito ho scritto un pezzo di codice in base a Jackson JSON processore, che è la migliore libreria JSON a mio parere

public void test() throws IOException { 
    String str = "{\n" + 
      " \"result\": \"Success\",\n" + 
      " \"AlertDetails\": [\n" + 
      " {\n" + 
      "  \"ShipmentNumber\": \"SHP34\",\n" + 
      "  \"Customer\": \"BEST\",\n" + 
      "  \"DateCreated\": \"2012-08-29T04:59:18Z\",\n" + 
      "  \"CustomerName\": \"BEST\"\n" + 
      " }\n" + 
      " ]\n" + 
      "}"; 

    JsonFactory factory = new JsonFactory(); 
    JsonParser jsonParser = factory.createJsonParser(str); 

    JsonToken jsonToken; 
    SerializedString alertDetails = new SerializedString("AlertDetails"); 
    while (!jsonParser.nextFieldName(alertDetails)) { /* move to AlertDetails field */ } 

    jsonParser.nextToken(); // skip [ start array 
    jsonParser.nextToken(); // skip { start object 
    // until } end object 
    while ((jsonToken = jsonParser.nextToken()) != JsonToken.END_OBJECT) { 
     if (jsonToken == JsonToken.FIELD_NAME) { 
      System.out.println(jsonParser.getCurrentName()); 
     } 
    } 

} 

Esso stampa semplicemente fuori i nomi dei campi nello stesso ordine come in JSON:

ShipmentNumber 
Customer 
DateCreated 
CustomerName 

EDIT

Naturalmente è possibile utilizzare altri librerie come GSON ecc Ma ricordate, come è scritto su json.org, che:

Un oggetto è un insieme non ordinato di coppie nome/valore.

e l'ordine delle chiavi dipende dall'implementazione e potrebbe variare in ogni richiesta.

6

Utilizzare la libreria GSON da Google. Ha un sacco di impostazioni per leggere/creare/analizzare json array e oggetti json. Non l'ho testato per trovare la soluzione, ma penso sia uno strumento molto semplice e completo e in grado di risolvere il problema.

Problemi correlati