Saya ingin mengirim pesan dalam bentuk objek JSON ke server dan mengurai respons JSON dari server.
Contoh objek JSON
{
"post": {
"username": "John Doe",
"message": "test message",
"image": "image url",
"time": "current time"
}
}
Saya mencoba mengurai JSON secara manual dengan menggunakan atribut demi atribut. Apakah ada pustaka / utilitas yang dapat saya gunakan untuk mempermudah proses ini?
Jawaban:
Saya terkejut ini belum disebutkan: tetapi alih-alih menggunakan proses manual dengan paket kecil json.org, GSon dan Jackson jauh lebih nyaman digunakan. Begitu:
Jadi Anda benar-benar dapat mengikat POJO Anda sendiri, bukan simpul pohon atau Daftar dan Peta yang setengah-setengah. (dan setidaknya Jackson mengizinkan pengikatan ke hal-hal seperti itu juga (mungkin GSON juga, tidak yakin), JsonNode, Map, List, jika Anda benar-benar menginginkan ini, bukan objek 'nyata')
EDIT 19 MAR-2014:
Pesaing baru lainnya adalah perpustakaan Jackson jr : ia menggunakan pengurai / generator Streaming cepat yang sama seperti Jackson (
jackson-core
), tetapi bagian pengikat data kecil (50kB). Fungsinya lebih terbatas (tidak ada anotasi, hanya Java Beans biasa), tetapi dari segi performa harus cepat, dan overhead inisialisasi (panggilan pertama) juga sangat rendah. Jadi ini mungkin pilihan yang bagus, terutama untuk aplikasi yang lebih kecil.sumber
Anda dapat menggunakan org.json.JSONObject dan org.json.JSONTokener . Anda tidak memerlukan pustaka eksternal karena kelas-kelas ini hadir dengan Android SDK
sumber
GSON paling mudah digunakan dan cara terbaik jika datanya memiliki struktur yang pasti.
Unduh gson .
Tambahkan ke perpustakaan yang direferensikan.
package com.tut.JSON; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.os.Bundle; import android.util.Log; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class SimpleJson extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); String jString = "{\"username\": \"tom\", \"message\": \"roger that\"} "; GsonBuilder gsonb = new GsonBuilder(); Gson gson = gsonb.create(); Post pst; try { pst = gson.fromJson(jString, Post.class); } catch (JSONException e) { e.printStackTrace(); } } }
Kode untuk kelas Post
package com.tut.JSON; public class Post { String message; String time; String username; Bitmap icon; }
sumber
Ini adalah kelas JsonParser
public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String json = ""; // constructor public JSONParser() { } public JSONObject getJSONFromUrl(String url) { // Making HTTP request try { // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); json = sb.toString(); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } // try parse the string to a JSON object try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } // return JSON String return jObj; }
Catatan: DefaultHttpClient tidak lagi didukung oleh sdk 23, jadi disarankan untuk menggunakan target sdk 21 dengan kode ini.
sumber
Sebenarnya tidak ada apa-apa untuk JSON. Tanda kurung kurawal untuk "objek" (array asosiatif) dan tanda kurung siku untuk array tanpa kunci (diindeks secara numerik). Sejauh bekerja dengannya di Android, ada kelas yang sudah jadi untuk itu yang disertakan dalam sdk (tidak perlu mengunduh).
Lihat kelas-kelas ini: http://developer.android.com/reference/org/json/package-summary.html
sumber
Jawaban lain telah mencatat Jackson dan GSON - pustaka JSON tambahan yang populer untuk Android, dan json.org, paket JSON tanpa tulang yang disertakan dalam Android.
Tapi saya pikir perlu juga dicatat bahwa Android sekarang memiliki JSON API berfitur lengkapnya sendiri.
Ini ditambahkan di Honeycomb: API level 11.
Ini terdiri dari
- android.util.JsonReader: docs , dan source
- android.util.JsonWriter: docs , dan source
Saya juga akan menambahkan satu pertimbangan tambahan yang mendorong saya kembali ke Jackson dan GSON: Saya merasa berguna untuk menggunakan pustaka pihak ketiga daripada paket android. * Karena kode yang saya tulis dapat dibagi antara klien dan server. Ini sangat relevan untuk sesuatu seperti JSON, di mana Anda mungkin ingin membuat serial data ke JSON di satu ujung untuk dikirim ke ujung lainnya. Untuk kasus penggunaan seperti itu, jika Anda menggunakan Java di kedua ujungnya, sebaiknya hindari penggunaan dependensi android. *.
Atau saya kira seseorang dapat mengambil kode sumber android. * Yang relevan dan menambahkannya ke proyek server Anda, tetapi saya belum mencobanya ...
sumber
Anda dapat mengunduh perpustakaan dari http://json.org (Json-lib atau org.json) dan menggunakannya untuk mengurai / membuat JSON
sumber
Anda hanya perlu mengimpor ini
import org.json.JSONObject; constructing the String that you want to send JSONObject param=new JSONObject(); JSONObject post=new JSONObject();
im menggunakan dua objek karena Anda dapat memiliki jsonObject dalam yang lain
post.put("username(here i write the key)","someusername"(here i put the value); post.put("message","this is a sweet message"); post.put("image","http://localhost/someimage.jpg"); post.put("time": "present time");
kemudian saya meletakkan posting json di dalam yang lain seperti ini
param.put("post",post);
ini adalah metode yang saya gunakan untuk membuat permintaan
makeRequest(param.toString()); public JSONObject makeRequest(String param) { try {
mengatur koneksi
urlConnection = new URL("your url"); connection = (HttpURLConnection) urlConnection.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-type", "application/json;charset=UTF-8"); connection.setReadTimeout(60000); connection.setConnectTimeout(60000); connection.connect();
mengatur arus keluaran
dataOutputStream = new DataOutputStream(connection.getOutputStream());
saya menggunakan ini untuk melihat di logcat apa yang saya kirim
Log.d("OUTPUT STREAM " ,param); dataOutputStream.writeBytes(param); dataOutputStream.flush(); dataOutputStream.close(); InputStream in = new BufferedInputStream(connection.getInputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); result = new StringBuilder(); String line;
di sini tali itu dibuat
while ((line = reader.readLine()) != null) { result.append(line); }
saya menggunakan log ini untuk melihat apa yang terjadi dalam respons
Log.d("INPUTSTREAM: ",result.toString());
instancing a json dengan String yang berisi respons server
jResponse=new JSONObject(result.toString()); } catch (IOException e) { e.printStackTrace(); return jResponse=null; } catch (JSONException e) { e.printStackTrace(); return jResponse=null; } connection.disconnect(); return jResponse; }
sumber
jika Anda mencari parsing json cepat di android daripada saya sarankan Anda alat yang tersedia secara bebas.
Alat Pembuat Kelas JSON
Ini gratis untuk digunakan dan itu membuat semua kelas parsing json Anda dalam satu-dua detik ..: D
sumber
Meskipun sudah ada jawaban bagus yang diberikan oleh pengguna seperti mendorong penggunaan GSON dll. Saya ingin menyarankan penggunaan org.json . Ini mencakup sebagian besar fungsi GSON. Ini juga memungkinkan Anda untuk meneruskan string json sebagai argumen ke JSONObject itu dan itu akan mengurus sisanya misalnya:
JSONObject json = new JSONObject("some random json string");
Fungsi ini menjadikannya favorit pribadi saya.
sumber
Ada beberapa pustaka sumber terbuka yang dapat Anda gunakan untuk mengurai json.
org.json: - Jika Anda ingin membaca atau menulis json maka Anda dapat menggunakan perpustakaan ini. Pertama buat JsonObject: -
JSONObject jsonObj = new JSONObject(<jsonStr>);
Sekarang, gunakan objek ini untuk mendapatkan nilai Anda: -
String id = jsonObj.getString("id");
Anda dapat melihat contoh lengkapnya di sini
Jackson databind: - Jika Anda ingin mengikat dan mengurai json Anda ke kelas POJO tertentu, maka Anda dapat menggunakan perpustakaan jackson-databind, ini akan mengikat json Anda ke kelas POJO: -
ObjectMapper mapper = new ObjectMapper(); post= mapper.readValue(json, Post.class);
Anda dapat melihat contoh lengkapnya di sini
sumber