2009-09-08 9 views
112

Czy istnieje sposób w Java/J2ME, aby przekonwertować ciąg, takich jak:Konwertować ciąg JSON do obiektu w Java ME?

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

do wewnętrznej reprezentacji obiekt o tej samej, w jednej linii kodu?

Ponieważ obecna metoda jest zbyt uciążliwe:

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

Może biblioteka JSON?

+5

Twój ciąg nie jest tak naprawdę obiektem Json, zobacz standard Json ... Jest to bardziej jak notacja JavaScript. – PhiLho

+17

@Jeremy Rudd: Powinno być '{" name ":" MójNode "," width ": 200," height ": 100}' – voyager

+1

@voyager: Wiem, ale JavaScript obsługuje natywnie nazwy właściwości bez cudzysłowów. –

Odpowiedz

107

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 idealny dla J2ME.

można analizować JSON do obiektu Java w jednej linii jak ta,

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")); 
+1

Czy mogę korzystać z tej biblioteki w aplecie. Jeśli używa Refleksji, to mam do czynienia z błędem reflectpermission. Czy to działa? –

+0

Czy jsonSimple nadal ma klasę JSONParser? Nie mogę zadzwonić do klasy. –

+0

JSONParser jest obecnie przestarzałe. –

22

masz wiele JSON parsers for Java:

  • JSONObject.java
    JSONObject jest nieuporządkowana kolekcja par nazwa/wartość. Jego zewnętrzna forma to ciąg zawinięty w nawiasy klamrowe z dwukropkami między nazwami i wartościami oraz przecinki między wartościami i nazwami. Formularz wewnętrzny to obiekt mający metody get() i opt() do uzyskiwania dostępu do wartości według nazwy i metody put() do dodawania lub zastępowania wartości po nazwie. Wartości mogą być dowolnymi z następujących typów: Boolean, JSONArray, JSONObject, Number i String lub obiekt JSONObject.NULL.

  • JSONArray.java
    JSONArray to uporządkowany ciąg wartości. Jego zewnętrzna forma to ciąg zawinięty w nawiasy kwadratowe z przecinkami między wartościami. Formularz wewnętrzny jest obiektem posiadającym metody get() i opt() do uzyskiwania dostępu do wartości za pomocą metod index i put() w celu dodawania lub zastępowania wartości. Wartości mogą być dowolnymi z następujących typów: Boolean, JSONArray, JSONObject, Number i String lub obiekt JSONObject.NULL.

  • JSONStringer.java
    JSONStringer jest narzędziem do szybkiego generowania tekstu JSON.

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

  • JSONTokener.java
    JSONTokener pobiera łańcuch źródłowy i wyciąga z niego znaki i tokeny. Jest używany przez konstruktory JSONObject i JSONArray do analizowania łańcuchów źródłowych JSON.

  • JSONException.java
    Wyjątek JSONEx jest zgłaszany w przypadku wykrycia składni lub błędu proceduralnego.

  • JSONString.java
    The JSONString jest interfejsem, który pozwala realizować swoje zajęcia do JSON serializacji.

+0

Który z nich działa na J2ME? –

+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 ;, możesz użyć pierwszego, ponieważ są to proste klasy 'java'. – voyager

+2

Myślę, że nie ma pakietu java.lang.reflect w MIDP 2.0. Trudno będzie utworzyć ogólny parser ... – PhiLho

2

pisałem bibliotekę, która używa json.org do analizowania JSON, ale to rzeczywiście stworzyć pełnomocnik interfejs dla ty. 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, jest to obecnie dostaje twardą zależność Kolekcje Google którą chcesz usunąć, i to chyba zbyt wysokiej gramaturze do swoich potrzeb, ale pozwala na interakcję z danymi JSON w drodze 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"); 
+0

Niesamowite, choć nie chcę Foo, tylko natywny obiekt. –

59

GSON jest dobrym rozwiązaniem do konwersji obiektu Java na obiekt Json i odwrotnie.
Jest to narzędzie dostarczane przez google.

do konwersji json Java użytkowania obiektu: fromJson(jsonObject,javaclassname.class)
przekształcania obiektu java json użytkowania obiektu: toJson(javaObject)
a reszta zostanie wykonana automatycznie

Więcej information and for download

+1

+1 Szukałem czegoś podobnego i to idealnie pasuje do rachunku! –

7

JSON official site gdzie należy szukać w. Zapewnia różne biblioteki, które mogą być używane z Javą, ja osobiście użyłem tego, JSON-lib, który jest implementacją pracy na stronie, więc ma dokładnie tę samą klasę - metody itp. W tym page.

Po kliknięciu linków html możesz tam znaleźć wszystko, czego potrzebujesz.

W skrócie:

utworzenia obiektu json i tablicę json, kod jest:

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

o1, o2, mogą być typy pierwotne (długi, int logiczna), struny lub Tablice.

Proces odwrotny jest dość prosty, tzn. Konwersję ciągu znaków na obiekt/tablicę Json.

String myString; 

JSONObject obj = new JSONObject(myString); 

JSONArray array = new JSONArray(myString); 

Aby być poprawnie przeanalizowanym, musisz tylko wiedzieć, czy parsujesz tablicę lub obiekt.

78

Najprostszym rozwiązaniem jest Jackson:

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

Istnieją inne podobnie prosty w użyciu bibliotek (Gson już wspomniano); ale niektóre opcje są bardziej pracochłonne, np. org.biblioteka json, która wymaga utworzenia pośredniego "JSONObject", nawet jeśli nie ma takiej potrzeby.

+0

Jackson nie obsługuje J2ME – skue

+0

Prawda, jeśli j2me jest nadal w przybliżeniu na poziomie JDK 1.4 (Jackson wymaga 1.5) – StaxMan

+1

Masz tylko 2 upliki, ale zasługuje na więcej. Jackson był naprawdę łatwy do zainstalowania w naszej aplikacji. Dzięki za polecenie. –

23

Możesz to łatwo zrobić za pomocą Google GSON.

Załóżmy, że masz klasę o nazwie Użytkownik 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żna łatwo zrobić, bez konieczności cast (utrzymanie komentarz nimcap w głowie;)), z następującym kodem:

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

Gdzie jsonString jest powyżej JSON String.

Aby uzyskać więcej informacji, prosimy zajrzeć do https://code.google.com/p/google-gson/

+3

I tak, zdaję sobie sprawę, że pytanie zostało zadane 4 lata temu, ale moja odpowiedź jest dla zainteresowanych osób, które muszą to zrobić w chwili obecnej :) Mam nadzieję, że to komuś pomaga! – sufinawaz

3

JSON IO to zdecydowanie najprostszy sposób, aby przekonwertować ciąg JSON lub strumień wejściowy JSON do obiektu Java

String na obiekt Java
Object obj = JsonReader.jsonToJava("[\"Hello, World\"]");

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

0

Tylko obiekt JSON w java z poniższej Json String.In sprawa

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

jeśli powyższe jest ciąg Json, wystarczy utworzyć Json Object z tym.

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

Jest to stary pytanie i json-proste (https://code.google.com/p/json-simple/) może być dobrym rozwiązaniem w tym czasie, ale proszę wziąć pod uwagę, że projekt nie wydaje się być aktywny przez pewien czas!

Proponuję Gson który jest obecnie obsługiwana w: https://github.com/google/gson

Jeśli wydajność jest Twój problem można spojrzeć na niektórych benchmarkach http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ który porównania.

5

Podobnie jak wielu już wspomniano, dość prosty sposób to zrobić przy użyciu JSON.simple jak poniżej

import org.json.JSONObject; 

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

a następnie użyć jsonObj do czynienia z JSON obiektu. np. jsonObj.get ("nazwa");

Jak na poniższy link, JSON.simple wykazuje 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/

+0

Napisałeś, że wielu już napisało sugestię, którą wysłałeś. Jaka jest esencja Twojej odpowiedzi? – dakab

+1

@dakab Dzięki za komentarze. Istotą tego pytania było podanie jednej linii kodu, która służy temu celowi. A ponieważ istnieje wiele api dostępnych w tym celu, chciałem tylko podać dodatkowe informacje na temat porównania wydajności apis. Tak 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 apisów wspomnianych przez innych facetów w tym wątku. – Kripz

2

Jackson dla dużych plików, GSON dla małych plików, a JSON .simple za obsługę obu.

+1

dowody na poparcie komentarza do @ thangi http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ – Gob00st

+0

Widziałem to przedtem, ale także uważają, że małe pliki i tak są szybkie do przeanalizowania. Pomyślałbym tylko o JSON.simple, jeśli masz TON małych plików do przeanalizowania gdzie ta 30% różnica w stosunku do Jacksona będzie się sumować. Zobacz też tam najlepsze komentarze, że test porównawczy może nie być zbyt wiarygodny. Naprawdę, jeśli prędkość jest dla ciebie tak ważna, powinieneś zaprojektować ją tak, abyś mógł wstrzyknąć parser, aby łatwo zmienić implementację i zrobić własne testy porównawcze. – User