2013-05-15 2 views
13

Sono in grado di utilizzare la libreria json-simple in Java e ho utilizzato entrambi gli esempi e decoding. La duplicazione degli esempi di codifica andava bene, ma non sono stato in grado di far funzionare quelli di decodifica con JSON di tipo misto.Decodifica stringa JSON in Java

Uno dei miei problemi è che ci sono troppe classi nella libreria che non sono adeguatamente documentate e per le quali non ho la fonte (per poter leggere e capire il loro scopo). Di conseguenza, sto lottando per capire come utilizzare molte di queste classi.

Dopo aver letto questo esempio:

String jsonText = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}"; 
JSONParser parser = new JSONParser(); 

ContainerFactory containerFactory = new ContainerFactory(){ 
    public List creatArrayContainer() { 
     return new LinkedList(); 
    } 

    public Map createObjectContainer() { 
     return new LinkedHashMap(); 
    }      
}; 

try { 
    Map json = (Map)parser.parse(jsonText, containerFactory); 
    Iterator iter = json.entrySet().iterator(); 
    System.out.println("==iterate result=="); 

    while(iter.hasNext()) { 
     Map.Entry entry = (Map.Entry)iter.next(); 
     System.out.println(entry.getKey() + "=>" + entry.getValue()); 
    } 

    System.out.println("==toJSONString()=="); 
    System.out.println(JSONValue.toJSONString(json)); 
} catch(ParseException pe) { 
    System.out.println(pe); 
} 

dal json-simple official decoding tutorial, ho cercato di decodificare questo JSON:

{ 
"stat":{ 
    "sdr": "MAC address of FLYPORT", 
    "rcv": "ff:ff:ff:ff:ff:ff", 
    "time": "0000000000000", 
    "type": 0, 
    "subt": 0, 
    "argv": [ 
     {"type": "6","val": "NetbiosName"}, 
     {"type": "6","val": "MACaddrFlyport"}, 
     {"type": "6","val": "FlyportModel"}, 
     {"type": "1","val": id} 
    ] 
} 
} 

Sto scrivendo seguente codice da decodificare:

String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{1,2},{2,3}]}}"; 
    JSONObject jsonObject = new JSONObject(jsonString); 
    JSONObject newJSON = jsonObject.getJSONObject("stat"); 
    System.out.println(newJSON); 

Ma non funziona Infatti non sono riuscito a far funzionare l'esempio non modificato e gli autori originali non hanno spiegato il loro codice.

Qual è il modo più semplice per decodificare questo JSON come mostrato?

+0

Possiamo vedere il codice per la decodifica di una statistica? –

+0

Hai controllato con l'esempio 5 (gestore di contenuto simile a SAX Stoppable) in [tutorial di decodifica JSON ufficiale] (https://code.google.com/p/json-simple/wiki/DecodingExamples) Come posso vedere il codice è inteso per singolo dizionario (mappa)/matrice. Ma tu stai provando per il json con le mappe in una mappa (più mappe). Se sbaglio, correggimi – ram2013

+0

@ ram2013: ya .. quello che ho bisogno di decodificare sono le mappe nelle mappe ... e immagino che questo sia uno di loro. come se ottenga il valore di "stat", posso usarlo per ulteriori decodifiche JSON. –

risposta

17

Questo è il codice migliore e più semplice:

public class test 
{ 
    public static void main(String str[]) 
    { 
     String jsonString = "{\"stat\": { \"sdr\": \"aa:bb:cc:dd:ee:ff\", \"rcv\": \"aa:bb:cc:dd:ee:ff\", \"time\": \"UTC in millis\", \"type\": 1, \"subt\": 1, \"argv\": [{\"type\": 1, \"val\":\"stackoverflow\"}]}}"; 
     JSONObject jsonObject = new JSONObject(jsonString); 
     JSONObject newJSON = jsonObject.getJSONObject("stat"); 
     System.out.println(newJSON.toString()); 
     jsonObject = new JSONObject(newJSON.toString()); 
     System.out.println(jsonObject.getString("rcv")); 
     System.out.println(jsonObject.getJSONArray("argv")); 
    } 
} 

Il library definition of the json files are given here. E non sono le stesse librerie pubblicate here, cioè pubblicate da te. Quello che hai postato era simple json library Ho usato this library.

È possibile download the zip. Quindi creare un package nel progetto con org.json come nome. e incollare tutti i codici scaricati lì, e divertirsi.

Ritengo che questa sia la decodifica JSON migliore e più semplice.

+0

Come aggiungiamo l'escape '\' a '" 'in' JSON'? Non voglio fare un 'String.replace()' – Identity1

+0

Continuo a ricevere questa uscita " Un testo JSONObject deve iniziare con '{' a 1 [carattere 2 riga 1] " Il mio contenuto JSON non ha nulla prima del secondo" {" – Chandough

+0

Si prega di aggiornare il collegamento. È morto – muaaz

4

Bene, il tuo jsonString è sbagliato.

String jsonString = "{\"stat\":{\"sdr\": \"aa:bb:cc:dd:ee:ff\",\"rcv\": \"aa:bb:cc:dd:ee:ff\",\"time\": \"UTC in millis\",\"type\": 1,\"subt\": 1,\"argv\": [{\"1\":2},{\"2\":3}]}}"; 

uso questo jsonString e se si utilizza la stessa JSONParser e ContainerFactory nell'esempio si vedrà che sarà codificato/decodificato.

Inoltre, se si desidera stampare la stringa dopo stat qui va:

 try{ 
     Map json = (Map)parser.parse(jsonString, containerFactory); 
     Iterator iter = json.entrySet().iterator(); 
     System.out.println("==iterate result=="); 
     Object entry = json.get("stat"); 
     System.out.println(entry); 
     } 

E circa le librerie JSON, ci sono un sacco di loro. Meglio controllare this.

+0

link is dead ... –

2

Questa è la stringa JSON vogliamo decodificare:

{ 
    "stats": { 
     "sdr": "aa:bb:cc:dd:ee:ff", 
     "rcv": "aa:bb:cc:dd:ee:ff", 
     "time": "UTC in millis", 
     "type": 1, 
     "subt": 1, 
     "argv": [ 
      {"1": 2}, 
      {"2": 3} 
     ]} 
} 

devo conservare questa stringa con il nome della variabile "sJSON" Ora, questo è il modo per decodificarlo :)

// Creating a JSONObject from a String 
JSONObject nodeRoot = new JSONObject(sJSON); 

// Creating a sub-JSONObject from another JSONObject 
JSONObject nodeStats = nodeRoot.getJSONObject("stats"); 

// Getting the value of a attribute in a JSONObject 
String sSDR = nodeStats.getString("sdr"); 
+1

Letter 's' manca un t "stat", dovrebbe essere JSONObject nodeStats = nodeRoot.getJSONObject ("stats"); destra ? –

3

Invece di scaricare file java separati come suggerito da Veer, puoi semplicemente aggiungere questo JAR file al tuo pacchetto.

per aggiungere il file jar al progetto in Eclipse, effettuare le seguenti operazioni:

  1. Fare clic destro sul progetto, fare clic su Crea percorso> Configura Build Path
  2. scheda
  3. Goto Biblioteche> Aggiungi JAR esterni
  4. Individuare il file JAR e aggiungere