Konwertować ciąg JSON na obiekt w Javie ME?

116

Czy w Javie / J2ME istnieje sposób na przekonwertowanie łańcucha, na przykład:

{name:"MyNode", width:200, height:100}

do wewnętrznej reprezentacji Object tego samego w jednej linii kodu?

Ponieważ obecna metoda jest zbyt żmudna:

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

Może biblioteka JSON?

Błysk
źródło
6
Twój ciąg nie jest tak naprawdę obiektem Json, zobacz standard Json ... Bardziej przypomina notację JavaScript.
PhiLho
19
@Jeremy Rudd: Powinien być{"name":"MyNode", "width":200, "height":100}
Esteban Küber
1
@voyager: Wiem, ale JavaScript natywnie obsługuje nazwy właściwości bez cudzysłowów.
TheFlash
1
@PhiLho: Wiem o tym, ale zostawiłem to w celu zachowania przejrzystości. Podświetlacz składni SO zepsułby to. Nazwa i wartość na czerwono.
TheFlash
Czy istnieje sposób na wykonanie konwersji przy użyciu podstawowych interfejsów API języka Java? Może w Javie 8? Java 9?
AlikElzin-kilaka

Odpowiedzi:

108

Użyłem kilku z nich, a moim ulubionym jest

http://code.google.com/p/json-simple/

Biblioteka jest bardzo mała, więc jest idealna dla J2ME.

Możesz przeanalizować JSON do obiektu Java w jednej linii, tak jak to:

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));
ZZ Coder
źródło
1
Czy mogę używać tej biblioteki w aplecie. Jeśli używa odbicia, to będę miał do czynienia z błędem zezwolenia na odbicie. Czy to zadziała?
Mridang Agarwalla
Czy jsonSimple nadal ma klasę JSONParser? Nie mogę zadzwonić na zajęcia.
phuwin
JSONParser jest teraz przestarzały.
Varda Elentári
79

Najprostszą opcją jest Jackson :

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

Istnieją inne, podobnie proste w użyciu biblioteki (wspomniano już o Gson); ale niektóre opcje są bardziej pracochłonne, na przykład oryginalna biblioteka org.json, która wymaga utworzenia pośredniego „JSONObject”, nawet jeśli nie jest to potrzebne.

StaxMan
źródło
Jackson nie obsługuje J2ME
skue
To prawda, jeśli j2me nadal jest z grubsza na poziomie JDK 1,4 (Jackson wymaga 1,5)
StaxMan
1
Masz tylko 2 wzrosty, ale zasługujesz na więcej. Jacksona bardzo łatwo było podłączyć do naszej aplikacji. Dzięki za polecenie.
Dan Doyon,
1
Jackson może również deserializować się do zwykłego obiektu. na przykład. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye
Więcej przykładów kodu wykorzystujących Jacksona: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo
61

GSON to dobra opcja do konwersji obiektu Java na obiekt JSON i odwrotnie.
Jest to narzędzie udostępnione przez Google.

do konwersji json na obiekt java użyj: fromJson(jsonObject,javaclassname.class)
do konwersji obiektu java na obiekt json użyj: toJson(javaObject)
a reszta zostanie wykonana automatycznie

Więcej informacji i do pobrania

Alok Vaish
źródło
1
+1 Szukałem czegoś podobnego i to idealnie pasuje do rachunku!
Roy Tang,
23

Możesz to łatwo zrobić dzięki Google GSON.

Załóżmy, że masz klasę o nazwie User z polami user, width i height i chcesz przekonwertować następujący ciąg json na obiekt User.

{"name":"MyNode", "width":200, "height":100}

Możesz to łatwo zrobić, bez konieczności rzutowania (pamiętając o komentarzu nimcap;)), używając następującego kodu:

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

Gdzie jsonString to powyższy ciąg JSON.

Więcej informacji można znaleźć pod adresem https://code.google.com/p/google-gson/

sufinawaz
źródło
3
I tak, zdaję sobie sprawę, że pytanie padło 4 lata temu, ale moja odpowiedź jest dla zainteresowanych stron, które muszą to zrobić teraz :) Mam nadzieję, że to komuś pomoże!
sufinawaz
22

Masz wiele parserów JSON dla Javy :

  • JSONObject.java
    JSONObject to nieuporządkowany zbiór par nazwa / wartość. Jego zewnętrzną formą jest ciąg zawinięty w nawiasy klamrowe z dwukropkami między nazwami i wartościami oraz przecinkami między wartościami i nazwami. Forma wewnętrzna to obiekt posiadający metody get () i opt () do uzyskiwania dostępu do wartości według nazwy oraz metody put () do dodawania lub zastępowania wartości według nazwy. Wartości mogą być dowolnego z tych typów: Boolean, JSONArray, JSONObject, Number i String lub obiekt JSONObject.NULL.

  • JSONArray.java
    JSONArray to uporządkowana sekwencja wartości. Jego zewnętrzną formą jest ciąg zawinięty w nawiasy kwadratowe z przecinkami między wartościami. Forma wewnętrzna jest obiektem posiadającym metody get () i opt () do uzyskiwania dostępu do wartości według indeksu oraz metody put () do dodawania lub zastępowania wartości. Wartości mogą być dowolnego z tych typów: Boolean, JSONArray, JSONObject, Number i String lub obiekt JSONObject.NULL.

  • JSONStringer.java
    JSONStringer to narzędzie do szybkiego tworzenia tekstu JSON.

  • JSONWriter.java
    JSONWriter to narzędzie do szybkiego zapisywania tekstu JSON w strumieniach.

  • JSONTokener.java
    JSONTokener pobiera ciąg źródłowy i wyodrębnia z niego znaki i tokeny. Jest używany przez konstruktory JSONObject i JSONArray do analizowania ciągów źródłowych JSON.

  • JSONException.java Wyjątek
    JSONException jest generowany po wykryciu błędu składniowego lub proceduralnego.

  • JSONString.java
    JSONString to interfejs, który umożliwia klasom implementację serializacji JSON.

Esteban Küber
źródło
1
Jeśli J2ME ma wyjątek java.io.IOException; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet ;, wtedy możesz użyć pierwszej z nich, ponieważ są to proste javaklasy.
Esteban Küber
2
Myślę, że w MIDP 2.0 nie ma pakietu java.lang.reflect. Trudno będzie stworzyć ogólny parser ...
PhiLho,
2
Sprytny gość, podróżnik, właśnie skopiowałeś dokumentację standardowych klas Java JSON.
TheFlash
@Jeremy Rudd: oczywiście, że tak, jak myślisz, że zrobiłem to tak szybko? To nie była próba trollowania ciebie, standardowa praktyka łączenia i kopiowania. Przepraszam, jeśli tak wyszło.
Esteban Küber
10
Odrzuciłem to, ponieważ nie odpowiada na pytanie. Zawiera listę powiązanych klas, ale żadna z nich nie osiąga tego, czego chce pytający.
Jeff Martin,
7

Powinieneś spojrzeć na oficjalną stronę JSON . Udostępnia różne biblioteki, których można używać z Javą, osobiście korzystałem z tej, JSON-lib która jest implementacją pracy w witrynie, więc ma dokładnie tę samą klasę - metody itp. Na tej stronie .

Jeśli klikniesz tam linki html, możesz znaleźć wszystko, co chcesz.

W skrócie:

aby utworzyć obiekt json i tablicę json, kod wygląda następująco:

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

o1, o2, mogą być typami pierwotnymi (long, int, boolean), stringami lub tablicami.

Proces odwrotny jest dość prosty, mam na myśli konwersję ciągu na obiekt / tablicę json.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Aby uzyskać poprawną analizę, wystarczy wiedzieć, czy analizujesz tablicę, czy obiekt.

tzik
źródło
5

Jak wielu już powiedziało, całkiem prosty sposób na zrobienie tego za pomocą JSON.simple, jak poniżej

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

Następnie użyj jsonObj do obsługi obiektu JSON. np. jsonObj.get („nazwa”);

Jak na poniższy link, JSON.simple pokazuje stałą wydajność zarówno dla małych, jak i dużych plików JSON

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/

Kripz
źródło
Napisałeś, że wielu już zgłosiło opublikowaną sugestię. Jaka jest istota Twojej odpowiedzi?
Dakab
1
@dakab Dzięki za komentarze. Istotą tego pytania było podanie jednej linii kodu, która spełniałaby zadanie. A ponieważ dostępnych jest wiele interfejsów API, które to robią, chciałem tylko podać dodatkowe informacje na temat porównania wydajności tych interfejsów. Więc istotą tej odpowiedzi, którą miałem na myśli, było podanie kodu + trochę informacji o porównaniu wydajności różnych API, o których wspominali inni koledzy w tym wątku.
Kripz
3

JSON IO to zdecydowanie najłatwiejszy sposób konwersji ciągu JSON lub strumienia wejściowego JSON na obiekt Java

Ciąg do obiektu Java
Object obj = JsonReader.jsonToJava("[\"Hello, World\"]");

https://code.google.com/p/json-io/

Josue Alexander Ibarra
źródło
3

To jest stare pytanie i proste json ( https://code.google.com/p/json-simple/ ) może być w tamtym czasie dobrym rozwiązaniem, ale proszę wziąć pod uwagę, że projekt wydaje się być nieaktywny przez chwilę!

Proponuję Gson, który jest teraz hostowany pod adresem : https://github.com/google/gson

Jeśli Twoim problemem jest wydajność, możesz rzucić okiem na http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ niektóre testy porównawcze .

Alireza Fattahi
źródło
2

Napisałem bibliotekę, która używa json.org do parsowania JSON, ale w rzeczywistości utworzy ona dla ciebie proxy interfejsu. Kod / JAR znajduje się na code.google.com.

http://fixjures.googlecode.com/

Nie wiem, czy to działa na J2ME. Ponieważ używa Java Reflection do tworzenia serwerów proxy, myślę, że to nie zadziała. Ponadto obecnie jest mocno zależny od Kolekcji Google, które chcę usunąć i prawdopodobnie jest zbyt ciężki dla Twoich potrzeb, ale pozwala na interakcję z danymi JSON w sposób, którego szukasz:

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");
Steve Reed
źródło
Niesamowite, chociaż nie chcę Foo, tylko rodzimego Obiektu.
TheFlash
2

Po prostu utwórz obiekt Json w Javie z następującym ciągiem Json

{name:"MyNode", width:200, height:100}

jeśli powyższy ciąg jest ciągiem Json, po prostu utwórz z nim obiekt Json.

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));
Baran
źródło
2

Jackson dla dużych plików, GSON dla małych plików i JSON.simple do obsługi obu.

Thanga
źródło
1
dowód na poparcie komentarza @ thanga blog.takipi.com/…
Gob00st
Widziałem to już wcześniej, ale pamiętaj również, że małe pliki i tak szybko się analizują. Pomyślałbym o JSON.simple tylko wtedy, gdy masz TONĘ małych plików do przeanalizowania, gdzie ta 30% różnica w porównaniu z Jacksonem będzie się sumować. Zobacz również najważniejsze komentarze, które mogą nie być zbyt wiarygodne. Naprawdę, jeśli szybkość jest dla Ciebie tak ważna, prawdopodobnie powinieneś zaprojektować tak, aby móc wstrzyknąć parser w celu łatwej zmiany implementacji i wykonać własne testy porównawcze.
Użytkownik