Mengirim dan Mengurai Objek JSON di Android [ditutup]

138

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?

Primal Pappachan
sumber
2
URL itu tidak lagi tersedia ... bisakah Anda memperbaruinya?
Cipi
1
Berikut adalah contoh detailnya: Android - Contoh Parsing JSON
Paresh Mayani
1
@ Paresh Mayani & @ primpap .. Saya tahu bahwa kita dapat mengisi data dari server menggunakan JSON yang diterima dari server menggunakan metode get, saya merasa nyaman dengan itu .... tetapi jika kita menggunakan metode posting untuk mengirim data ke server, lakukan kami mengirim data sebagai JSON lagi, saya mengacu pada Kutipan pertanyaan primpap "Saya ingin mengirim pesan dalam bentuk objek JSON ke Server Django" ..... Saya menggunakan Mysql di server .... atau Saya mengirim objek JSON? ... dapatkah Anda mengklarifikasi info ini kepada saya .... atau tautan apa pun yang membantu saya memahami konsep ini akan membantu, Terima kasih
Devrath

Jawaban:

118

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.

StaxMan
sumber
10
1 untuk GSON. Kami secara khusus menggunakan situs dukungan streaming GSON sites.google.com/site/gson/streaming di aplikasi Android kami.
Andre Steingress
FWIW, Jackson juga memiliki Streaming API: wiki.fasterxml.com/JacksonStreamingApi
StaxMan
2
Juga +1 untuk streaming GSON. Mengimplementasikan Jackson streaming pada awalnya tetapi meskipun berfungsi dalam versi debug, ProGuard menghasilkan banyak kesalahan dan versi rilis menyebabkan crash yang sulit dilacak. Saya yakin ini bukan masalah terkait Jackson, tetapi itu membuat saya beralih ke GSON yang berfungsi dengan baik dan hanya memerlukan tambahan 14kB untuk streaming saja.
sven
Dan untuk string pencampuran json yang tidak dapat diprediksi dan daftar misalnya: ["toto", "tata", ["monty", ["tor", "python"]]]? (jenis struktur data yang membutuhkan fungsi rekursif untuk menggunakannya)
christophe31
85

Anda dapat menggunakan org.json.JSONObject dan org.json.JSONTokener . Anda tidak memerlukan pustaka eksternal karena kelas-kelas ini hadir dengan Android SDK

Valentin Golev
sumber
Ups! Saya melewatkan itu. Faktanya, mereka adalah perpustakaan org.json di situs web.
Gaurav Vaish
Inilah yang saya gunakan, dan berfungsi dengan baik.
Adam
Akan lebih bagus jika contoh atau tautan yang sama dapat diberikan. Lebih mudah untuk belajar seperti itu. :)
Primal Pappachan
1
Lebih banyak kemudahan, lebih sedikit kode untuk ditulis: satu atau dua baris, bukan lusinan.
StaxMan
31

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;
}
Primal Pappachan
sumber
4
Untuk apa nilainya, kode dapat disederhanakan: bahwa konversi JSONObject tidak diperlukan. Dan setter dan getter adalah opsional untuk GSon; dapat ditambahkan jika diinginkan, tetapi tidak sepenuhnya diperlukan.
StaxMan
4
Hanya untuk mengklarifikasi komentar StaxMan. Contoh Anda adalah mengambil jString, mengonversinya menjadi JSONObject, lalu mengonversinya kembali menjadi String untuk dibaca oleh gson. Cukup gunakan pst = gson.fromJson (jString, Post.class). Saya percaya ini juga akan menghilangkan kebutuhan akan coba-tangkap. Dan seperti yang juga ditunjukkan oleh StaxMan, setter & getter di Post.class tidak menambah nilai. Akan sangat membantu orang lain untuk memperbaiki teladan Anda.
Matt
Saya menghapus bagian konversi ganda dari jawaban
whlk
4

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.

www.9android.net
sumber
3

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

Kaya
sumber
Saya kira yang Anda maksud adalah kurung kurawal dan bukan tanda kurung siku!
Gaurav Vaish
2

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 ...

Tom
sumber
1

Anda dapat mengunduh perpustakaan dari http://json.org (Json-lib atau org.json) dan menggunakannya untuk mengurai / membuat JSON

Gaurav Vaish
sumber
1

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;
}
Edgardo Alvarez
sumber
terima kasih atas waktu Anda sebelumnya. Saya menggunakan kode Anda untuk mengirim string yang disandikan base64 ke server django tetapi ketika saya mengklik tombol untuk mengirim ke server, APP macet. Bisakah Anda membantu saya mengatasi ini?
Noman marwat
0

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

sachin
sumber
0

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.

Moosa
sumber
0

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

Akash
sumber