JSON dizesini Java ME'de nesneye dönüştür?


116

Java / J2ME'de bir dizeyi dönüştürmenin bir yolu var mı, örneğin:

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

bir kod satırında aynı iç Nesne temsiline mi?

Mevcut yöntem çok sıkıcı olduğu için:

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

Belki bir JSON kitaplığı?


6
Diziniz gerçekten bir Json nesnesi değil, Json standardına bakın ... Daha çok JavaScript gösterimi gibidir.
PhiLho

19
@Jeremy Rudd: Olmalı{"name":"MyNode", "width":200, "height":100}
Esteban Küber

1
@voyager: Biliyorum, ancak JavaScript, özellik adlarını tırnak işaretleri olmadan yerel olarak destekler.
TheFlash

1
@PhiLho: Bunu biliyorum ama açıklık olsun diye bu şekilde tuttum. SO sözdizimi vurgulayıcı her şeyi berbat ederdi. Kırmızı renkte isim ve değer.
TheFlash 08

Java'nın temel API'lerini kullanarak dönüştürme yapmanın bir yolu var mı? Belki Java 8'de? Java 9?
AlikElzin-kilaka

Yanıtlar:


108

Birkaçını kullandım ve favorim şu:

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

Kitaplık çok küçük olduğundan J2ME için mükemmeldir.

JSON'u Java nesnesine şöyle bir satırda ayrıştırabilirsiniz,

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
Bu kitaplığı bir uygulamada kullanabilir miyim? Yansıma kullanıyorsa, o zaman bir yansıtma izni hatasıyla karşılaşacağım. İşe yarar mı?
Mridang Agarwalla

JsonSimple hala JSONParser sınıfına sahip mi? Sınıfı arayamam.
phuwin

JSONParser artık kullanımdan kaldırıldı.
Varda Elentári

79

En basit seçenek Jackson :

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

Benzer şekilde kullanımı kolay başka kütüphaneler de vardır (Gson'dan daha önce bahsedilmişti); ancak orijinal org.json kitaplığı gibi bazı seçenekler daha zahmetlidir ve bunlara ihtiyacınız olmasa bile ara "JSONObject" oluşturmanızı gerektirir.


Jackson
J2ME'yi

Doğru, eğer j2me hala kabaca JDK 1.4 seviyesindeyse (Jackson 1.5 gerektirir)
StaxMan

1
Sadece 2 yükselişin var ama daha fazlasını hak ediyor. Jackson'ın uygulamamıza eklenmesi gerçekten çok kolaydı. Tavsiye ettiğin için teşekkürler.
Dan Doyon

1
Jackson ayrıca düz bir nesneye dönüşebilir. Örneğin. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye

Jackson kullanarak daha fazla kod örneği: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo

61

GSON, java nesnesini json nesnesine dönüştürmek için iyi bir seçenektir ve bunun tersi de geçerlidir.
Google tarafından sağlanan bir araçtır.

json'u java nesnesine fromJson(jsonObject,javaclassname.class)
dönüştürmek için kullanın: java nesnesini json nesnesine dönüştürmek için kullanın: toJson(javaObject)
ve dinlenme otomatik olarak yapılacaktır

Daha fazlası için bilgi ve indirme için


1
+1 Benzer bir şey arıyordum ve bu faturaya tam olarak uyuyor!
Roy Tang

23

Bunu Google GSON ile kolayca yapabilirsiniz.

Diyelim ki user, width ve height alanlarına sahip User adında bir sınıfınız var ve aşağıdaki json dizesini User nesnesine dönüştürmek istiyorsunuz.

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

Bunu, aşağıdaki kodla yayınlamak zorunda kalmadan (nimcap'in yorumunu akılda tutarak;)) kolayca yapabilirsiniz:

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

JsonString yukarıdaki JSON Dizesidir.

Daha fazla bilgi için lütfen https://code.google.com/p/google-gson/ adresine bakın.


3
Ve evet, sorunun 4 yıl önce sorulduğunun farkındayım ama cevabım şu anda bunu yapmak isteyen ilgili taraflar için :) Umarım birine yardımcı olur!
sufinawaz

22

Java için birçok JSON ayrıştırıcınız var :

  • JSONObject.java
    JSONObject, ad / değer çiftlerinin sıralanmamış bir koleksiyonudur. Dış biçimi, adlar ve değerler arasında iki nokta üst üste ve değerler ile adlar arasında virgül bulunan küme parantezlerine sarılmış bir dizedir. Dahili form, değerlere ada göre erişmek için get () ve opt () yöntemlerine ve ada göre değer eklemek veya değiştirmek için put () yöntemlerine sahip bir nesnedir. Değerler şu türlerden herhangi biri olabilir: Boolean, JSONArray, JSONObject, Number ve String veya JSONObject.NULL nesnesi.

  • JSONArray.java
    JSONArray, sıralı bir değerler dizisidir. Dış biçimi, değerler arasında virgül bulunan köşeli parantez içine alınmış bir dizedir. Dahili form, değerlere dizine göre erişmek için get () ve opt () yöntemlerine ve değerleri eklemek veya değiştirmek için put () yöntemlerine sahip bir nesnedir. Değerler şu türlerden herhangi biri olabilir: Boolean, JSONArray, JSONObject, Number ve String veya JSONObject.NULL nesnesi.

  • JSONStringer.java
    JSONStringer, JSON metnini hızla üretmek için bir araçtır.

  • JSONWriter.java
    JSONWriter, JSON metnini akışlara hızla yazmak için bir araçtır.

  • JSONTokener.java
    Bir JSONTokener, bir kaynak dizeyi alır ve ondan karakterleri ve simgeleri çıkarır. JSONObject ve JSONArray yapıcıları tarafından JSON kaynak dizelerini ayrıştırmak için kullanılır.

  • JSONException.java
    Bir sözdizimi veya yordam hatası algılandığında bir JSONException atılır.

  • JSONString.java
    JSONString, sınıfların kendi JSON serileştirmelerini gerçekleştirmelerine izin veren bir arabirimdir.


1
J2ME'de java.io.IOException varsa; 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 ;, sonra basit javasınıflar oldukları için ilkini kullanabilirsiniz .
Esteban Küber

2
MIDP 2.0'da java.lang.reflect paketi olmadığını düşünüyorum. Genel bir ayrıştırıcı yapmak zor olacak ...
PhiLho

2
Akıllı adam, gezgin, standart Java JSON sınıflarının belgelerini kopyaladınız.
TheFlash

@Jeremy Rudd: Tabii ki yaptım, nasıl bu kadar hızlı yaptığımı düşündün? Sizi trolleme girişimi değildi, hem bağlantı hem de kopyalama için standart uygulaması. Öyle çıktıysa özür dilerim.
Esteban Küber

10
Soruyu cevaplamadığı için buna olumsuz oy verdim. İlgili sınıfların bir listesini veriyor ancak hiçbiri soruyu soranın istediğini gerçekten başaramıyor.
Jeff Martin

7

JSON resmi sitesi , bakmanız gereken yerdir. Java ile kullanılabilecek çeşitli kütüphaneler sağlar, ben şahsen bunu kullandım , sitedeki çalışmanın bir uygulaması olan JSON-lib , yani bu sayfada tamamen aynı sınıf - yöntemler vb. .

Orada html bağlantılarına tıklarsanız, istediğiniz her şeyi bulabilirsiniz.

Kısacası:

bir json nesnesi ve bir json dizisi oluşturmak için kod:

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

o1, o2, ilkel türler (long, int, boolean), Strings veya Arrays olabilir.

Ters işlem oldukça basittir, yani bir dizeyi json nesnesine / dizisine dönüştürmeyi kastediyorum.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Doğru bir şekilde çözümlenmek için bir diziyi mi yoksa bir nesneyi mi ayrıştırdığınızı bilmeniz gerekir.



5

Daha önce belirtildiği gibi, JSON kullanarak bunu yapmanın oldukça basit bir yolu. Aşağıdaki gibi basit

import org.json.JSONObject;

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

Ve sonra JSON Object ile uğraşmak için jsonObj kullanın. örneğin jsonObj.get ("ad");

Aşağıdaki bağlantıya göre, JSON.simple hem küçük hem de büyük JSON dosyaları için sürekli verimlilik gösteriyor

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


Birçok kişinin gönderdiğiniz öneriyi zaten belirttiğini yazdınız. Cevabınızın özü nedir?
dakab

1
@dakab Yorumlarınız için teşekkürler. Bu sorunun özü, amaca hizmet eden tek satırlık bir kod vermekti. Ve bunu yapmak için pek çok api olduğundan, apis'in verimliliğinin karşılaştırılması hakkında da ek bilgi vermek istedim. Yani kastettiğim bu cevabın özü, kodu + bu konudaki diğer arkadaşlar tarafından bahsedilen farklı apilerin verimliliklerinin karşılaştırılması hakkında biraz bilgi vermekti.
Kripz




2

JSON'u ayrıştırmak için json.org kullanan bir kitaplık yazdım, ancak bu aslında sizin için bir arabirimin proxy'sini oluşturacak. / JAR kodu code.google.com adresindedir.

http://fixjures.googlecode.com/

J2ME'de çalışıp çalışmadığını bilmiyorum. Proxy oluşturmak için Java Reflection kullandığından, işe yaramayacağını düşünüyorum. Ayrıca, şu anda kaldırmak istediğim Google Koleksiyonlarına sıkı bir bağımlılığı var ve muhtemelen ihtiyaçlarınız için çok ağır, ancak JSON verilerinizle aradığınız şekilde etkileşim kurmanıza izin veriyor:

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

Şaşırtıcı, yine de Foo'yu istemiyorum, sadece yerel Nesne.
TheFlash

2

Sadece aşağıdaki Json String ile java'da bir Json nesnesi oluşturun.

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

Yukarıdakiler sizin Json dizenizse, onunla bir Json Nesnesi oluşturun.

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

2

Jackson büyük dosyalar için, GSON küçük dosyalar için ve JSON.simple hem işleme için.


1
@ thanga'nın yorumunu buradan destekleyecek kanıt blog.takipi.com/…
Gob00st

Bunu daha önce de görmüştüm, ancak aynı zamanda küçük dosyaların yine de hızlı bir şekilde ayrıştırıldığını düşünüyorum. Jackson'a göre bu% 30 ya da daha fazla farkın toplanacağı yerde ayrıştırmak için bir TON küçük dosyanız varsa, sadece JSON.simple hakkında düşünürdüm. Ayrıca oradaki en iyi yorumlara bakın, bu kıyaslama çok güvenilir olmayabilir. Gerçekten, hız sizin için bu kadar önemliyse, uygulamaları kolayca değiştirmek için bir ayrıştırıcı enjekte edebilmeniz ve kendi kıyaslama testlerinizi yapabilmeniz için muhtemelen tasarlamalısınız.
Kullanıcı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.