Ubah string JSON menjadi objek di Java ME?


116

Apakah ada cara di Java / J2ME untuk mengonversi string, seperti:

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

ke representasi Objek internal yang sama, dalam satu baris kode?

Karena metode saat ini terlalu membosankan:

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

Mungkin perpustakaan JSON?


6
String Anda sebenarnya bukan objek Json, lihat standar Json ... Ini lebih seperti notasi JavaScript.
PhiLho

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

1
@voyager: Saya tahu, tetapi JavaScript secara native mendukung nama properti tanpa tanda kutip.
TheFlash

1
@PhiLho: Saya tahu itu, tapi saya tetap seperti ini demi kejelasan. Penyorot sintaks SO akan mengacaukannya. Nama dan nilai berwarna merah.
TheFlash

Apakah ada cara untuk melakukan konversi menggunakan API inti Java? Mungkin di Jawa 8? Jawa 9?
AlikElzin-kilaka

Jawaban:


109

Saya menggunakan beberapa di antaranya dan favorit saya adalah,

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

Perpustakaannya sangat kecil sehingga cocok untuk J2ME.

Anda dapat mengurai JSON menjadi objek Java dalam satu baris seperti ini,

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
Bisakah saya menggunakan perpustakaan ini di applet. Jika menggunakan Refleksi maka saya akan dihadapkan pada kesalahan izin refleksi. Apakah ini akan berhasil?
Mridang Agarwalla

Apakah jsonSimple masih memiliki kelas JSONParser? Saya tidak bisa menelepon kelas.
phuwin

JSONParser sekarang tidak digunakan lagi.
Varda Elentári

79

Opsi paling sederhana adalah Jackson :

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

Ada pustaka lain yang serupa yang mudah digunakan (Gson sudah disebutkan); tetapi beberapa pilihan lebih melelahkan, seperti pustaka org.json asli, yang mengharuskan Anda membuat "JSONObject" perantara meskipun Anda tidak membutuhkannya.


Jackson tidak mendukung J2ME
skue

Benar, jika j2me masih kira-kira di level JDK 1.4 (Jackson membutuhkan 1.5)
StaxMan

1
Anda hanya mendapatkan 2 peningkatan tetapi berhak mendapatkan lebih banyak. Jackson sangat mudah untuk di-plugin ke aplikasi kami. Terima kasih telah merekomendasikan.
Dan Doyon

1
Jackson juga dapat mengubah bahasa menjadi objek biasa. misalnya. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye


61

GSON adalah pilihan yang baik untuk mengonversi objek java ke objek json dan sebaliknya.
Ini adalah alat yang disediakan oleh google.

untuk mengubah objek json ke java gunakan: fromJson(jsonObject,javaclassname.class)
untuk mengubah objek java ke objek json gunakan: toJson(javaObject)
dan sisanya akan dilakukan secara otomatis

Untuk informasi lebih lanjut dan untuk mengunduh


1
+1 Saya sedang mencari sesuatu yang serupa dan ini sangat sesuai dengan tagihan!
Roy Tang

23

Anda dapat melakukannya dengan mudah dengan Google GSON.

Katakanlah Anda memiliki kelas yang disebut Pengguna dengan bidang pengguna, lebar, dan tinggi dan Anda ingin mengonversi string json berikut ke objek Pengguna.

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

Anda dapat dengan mudah melakukannya, tanpa harus melakukan cast (mengingat komentar nimcap;)), dengan kode berikut:

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

Di mana jsonString adalah String JSON di atas.

Untuk informasi lebih lanjut, harap lihat https://code.google.com/p/google-gson/


3
Dan ya, saya menyadari pertanyaan itu diajukan 4 tahun yang lalu, tetapi jawaban saya adalah untuk pihak yang berkepentingan yang perlu melakukan ini saat ini :) Semoga bisa membantu seseorang!
sufinawaz

22

Anda memiliki banyak parser JSON untuk Java :

  • JSONObject.java
    JSONObject adalah kumpulan pasangan nama / nilai yang tidak berurutan. Bentuk eksternalnya adalah string yang dibungkus dengan tanda kurung kurawal dengan titik dua di antara nama dan nilai, dan koma di antara nilai dan nama. Bentuk internal adalah objek yang memiliki metode get () dan opt () untuk mengakses nilai berdasarkan nama, dan metode put () untuk menambahkan atau mengganti nilai dengan nama. Nilainya dapat berupa salah satu dari jenis berikut: Boolean, JSONArray, JSONObject, Number, dan String, atau objek JSONObject.NULL.

  • JSONArray.java
    JSONArray adalah urutan nilai yang diurutkan. Bentuk eksternalnya adalah string yang dibungkus dalam tanda kurung siku dengan koma di antara nilainya. Bentuk internal adalah objek yang memiliki metode get () dan opt () untuk mengakses nilai dengan indeks, dan metode put () untuk menambahkan atau mengganti nilai. Nilainya dapat berupa salah satu dari jenis berikut: Boolean, JSONArray, JSONObject, Number, dan String, atau objek JSONObject.NULL.

  • JSONStringer.java
    JSONStringer adalah alat untuk memproduksi teks JSON dengan cepat.

  • JSONWriter.java
    JSONWriter adalah alat untuk menulis teks JSON dengan cepat ke aliran.

  • JSONTokener.java
    JSONTokener mengambil string sumber dan mengekstrak karakter dan token darinya. Ini digunakan oleh konstruktor JSONObject dan JSONArray untuk mengurai string sumber JSON.

  • JSONException.java
    muncul ketika kesalahan sintaks atau prosedural terdeteksi.

  • JSONString.java
    JSONString adalah antarmuka yang memungkinkan kelas untuk mengimplementasikan serialisasi JSON mereka.


1
Jika J2ME memiliki 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 ;, maka Anda dapat menggunakan yang pertama, karena ini adalah javakelas sederhana .
Esteban Küber

2
Saya rasa tidak ada paket java.lang.reflect di MIDP 2.0. Akan menyulitkan untuk membuat pengurai generik ...
PhiLho

2
Orang pintar, voyager, Anda baru saja menyalin dalam dokumentasi kelas Java JSON standar.
TheFlash

@ Jeremy Rudd: tentu saja, bagaimana menurut Anda bahwa saya melakukannya begitu cepat? Itu bukan upaya untuk menjebak Anda, praktik standarnya untuk menautkan dan menyalin. Saya minta maaf jika hasilnya seperti itu.
Esteban Küber

10
Saya tidak menyukai ini karena tidak menjawab pertanyaan. Ini memberikan daftar kelas terkait tetapi tidak satupun dari mereka benar-benar mencapai apa yang diinginkan penanya.
Jeff Martin

7

Situs resmi JSON adalah tempat yang harus Anda lihat. Ini menyediakan berbagai pustaka yang dapat digunakan dengan Java, saya pribadi menggunakan yang ini, JSON-lib yang merupakan implementasi pekerjaan di situs, sehingga memiliki kelas yang sama - metode dll di halaman ini .

Jika Anda mengklik tautan html di sana, Anda dapat menemukan apa pun yang Anda inginkan.

Pendeknya:

untuk membuat objek json dan array json, kodenya adalah:

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

o1, o2, dapat berupa tipe primitif (panjang, int, boolean), String atau Array.

Proses kebalikannya cukup sederhana, maksud saya mengubah string menjadi objek / array json.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Agar dapat diurai dengan benar, Anda hanya perlu mengetahui apakah Anda sedang mengurai array atau objek.



5

Seperti banyak yang sudah dinyatakan, Cara yang cukup sederhana untuk melakukan ini menggunakan JSON. Sederhana seperti di bawah ini

import org.json.JSONObject;

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

Dan kemudian gunakan jsonObj untuk menangani Objek JSON. misalnya jsonObj.get ("name");

Sesuai tautan di bawah ini, JSON.simple menunjukkan efisiensi konstan untuk file JSON kecil dan besar

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


Anda menulis bahwa banyak yang sudah menyatakan saran yang Anda posting. Apa inti dari jawaban Anda?
dakab

1
@dakab Terima kasih atas komentar Anda. Inti dari pertanyaan ini adalah memberikan satu baris kode yang sesuai dengan tujuan. Dan karena ada banyak apis yang tersedia untuk melakukan ini, saya hanya ingin memberikan sedikit info tambahan tentang perbandingan efisiensi apis juga. Jadi inti dari jawaban yang saya maksud adalah memberikan kode + beberapa info tentang perbandingan efisiensi dari berbagai API yang disebutkan oleh rekan-rekan lain di utas ini.
Kripz


3

Ini adalah pertanyaan lama dan json-simple ( https://code.google.com/p/json-simple/ ) bisa menjadi solusi yang baik pada saat itu, tetapi mohon pertimbangkan bahwa proyek tersebut tampaknya tidak aktif untuk sementara waktu!

Saya menyarankan Gson yang sekarang dihosting di: https://github.com/google/gson

Jika kinerja adalah masalah Anda, Anda dapat melihat beberapa tolok ukur http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ yang dibandingkan.



2

Saya telah menulis perpustakaan yang menggunakan json.org untuk mengurai JSON, tetapi itu sebenarnya akan membuat proxy antarmuka untuk Anda. Kode / JAR ada di code.google.com.

http://fixjures.googlecode.com/

Saya tidak tahu apakah ini berfungsi di J2ME. Karena menggunakan Java Reflection untuk membuat proxy, saya pikir itu tidak akan berhasil. Selain itu, saat ini sangat bergantung pada Koleksi Google yang ingin saya hapus dan mungkin terlalu berat untuk kebutuhan Anda, tetapi ini memungkinkan Anda untuk berinteraksi dengan data JSON seperti yang Anda cari:

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

Luar biasa, meskipun saya tidak menginginkan Foo, hanya Object aslinya.
TheFlash

2

Buat saja objek Json di java dengan Json String berikut. Dalam kasus Anda

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

jika di atas adalah string Json Anda, buat saja Objek Json dengannya.

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 untuk file besar, GSON untuk file kecil, dan JSON. Sederhana untuk menangani keduanya.


1
bukti untuk mendukung komentar @ thanga dari sini blog.takipi.com/…
Gob00st

Saya telah melihatnya sebelumnya juga, tetapi juga menganggap bahwa file kecil juga cepat untuk diurai. Saya hanya akan berpikir tentang JSON. Sederhana jika Anda memiliki TON file kecil untuk diurai di mana perbedaan 30% atau lebih dari Jackson akan bertambah. Lihat juga komentar teratas di sana, tolok ukur itu mungkin tidak terlalu bisa diandalkan. Sungguh, jika kecepatan itu penting bagi Anda, Anda mungkin harus mendesain sehingga Anda dapat memasukkan parser untuk mengubah implementasi dengan mudah, dan melakukan pengujian tolok ukur Anda sendiri.
Pengguna
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.