2013-05-15 9 views
13

Jestem nowy w korzystaniu z biblioteki json-simple w Javie i przeszukałem zarówno próbki encoding, jak i decoding. Duplikowanie przykładów kodowania było w porządku, ale nie udało mi się przekonać dekoderów do pracy z JSON typu mieszanego.Dekodowanie łańcucha JSON w języku Java

Jednym z moich problemów jest to, że w bibliotece jest zbyt wiele klas, które nie są odpowiednio udokumentowane, a dla których nie mam źródła (aby móc je przeczytać i zrozumieć ich cel). W związku z tym staram się zrozumieć, jak korzystać z wielu tych klas.

Po przeczytaniu tego przykład:

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); 
} 

z json-simple official decoding tutorial, starałem się rozszyfrować ten 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} 
    ] 
} 
} 

piszę następujący kod do dekodowania:

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); 

Ale to nie działa. Rzeczywiście, nie udało mi się uzyskać niezmodyfikowanego przykładu działającego, a oryginalni autorzy nie wyjaśnili swojego kodu.

Jaki jest najprostszy sposób dekodowania tego JSON, jak pokazano?

+0

Czy możemy zobaczyć twój kod do dekodowania statystyk? –

+0

Czy sprawdziłeś z przykładem 5 (Zatrzymywanie obsługi treści podobnej do SAX) w [Samouczek oficjalnego dekodowania JSON] (https://code.google.com/p/json-simple/wiki/DecodingExamples) Jak widzę to kod jest przeznaczony dla pojedynczego słownika (Mapa)/Tablica. Ale próbujesz json z mapami na mapie (wiele map). Jeśli się mylę, popraw mnie. – ram2013

+0

@ ram2013: ya ... moje dane do odkodowania to mapy na mapach ... i myślę, że to jeden z nich. tak jakbym otrzymał wartość "stat", mogę go użyć do dalszego dekodowania JSON. –

Odpowiedz

17

Jest to najlepszy i najprostszy kod:

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")); 
    } 
} 

library definition of the json files are given here. I nie jest to ta sama biblioteka, co opublikowana here, tj. Wysłana przez Ciebie. To, co opublikowałeś, to simple json library Użyłem this library. Można uzyskać . Następnie utwórz w projekcie package z nazwą org.json. i wklej tam wszystkie pobrane kody i baw się dobrze.

Uważam, że jest to najlepsze i najłatwiejsze dekodowanie JSON.

+0

Jak dodać escape "\" do '" 'w' JSON'? Nie chcę zrobić 'String.replace()' – Identity1

+0

Otrzymuję to wyjście " Tekst JSONObject musi rozpoczynać się od "{" w 1 [znak 2 wiersz 1] " Moja treść JSON nie ma nic przed drugim" {" – Chandough

+0

Proszę zaktualizować link, jego martwe – muaaz

4

Cóż, Twój jsonString jest nieprawidłowy.

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}]}}"; 

Użyj tej jsonString i jeśli używasz tej samej JSONParser i ContainerFactory w tym przykładzie widać, że to będzie kodowany/dekodowany.

Dodatkowo, jeśli chcesz wydrukować ciąg po stat o to idzie:

 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); 
     } 

io bibliotekach json, istnieje wiele z nich. Lepiej sprawdzić this.

+0

link jest martwy ... –

2

Jest to JSON String chcemy zdekodować:

{ 
    "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} 
     ]} 
} 

przechowywać ten ciąg pod nazwą zmiennej "sJSON" Teraz jest to jak go rozszyfrować :)

// 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

W liście "brakuje" t "stat", powinno być JSONObject nodeStats = nodeRoot.getJSONObject ("stats"); dobrze ? –

3

Zamiast pobierać osobne pliki java zgodnie z sugestią firmy Veer, możesz po prostu dodać ten pakiet do swojego pakietu JAR file.

Aby dodać plik jar do projektu w Eclipse, wykonaj następujące czynności:

  1. prawym przyciskiem myszy na projekcie, kliknij Build Path> Configure Build Path
  2. kartę
  3. Goto Libraries> Add JAR zewnętrzne
  4. Znajdź plik JAR i dodaj
Powiązane problemy