Android'de JSON Nesnelerini Gönderme ve Ayrıştırma [kapalı]


137

Bir sunucuya JSON nesneleri şeklinde mesaj göndermek ve sunucudan JSON yanıtı ayrıştırmak istiyorum.

JSON nesnesi örneği

{
  "post": {
    "username": "John Doe",
    "message": "test message",
    "image": "image url",
    "time":  "current time"
  }
}

Özniteliğe göre özniteliği girerek elle JSON ayrıştırmaya çalışıyorum. Bu işlemi kolaylaştırmak için kullanabileceğim herhangi bir kütüphane / yardımcı program var mı?


2
Bu URL artık mevcut değil ... güncelleyebilir misiniz?
Cipi

1
İşte ayrıntılı bir örnek: Android - JSON Ayrıştırma örneği
Paresh Mayani

1
@ Paresh Mayani & @ primpap .. Ben biliyorum get get yöntemini kullanarak sunucudan alınan JSON kullanarak sunucudan veri doldurabilir, ben rahatım .... ama eğer sunucuya veri göndermek için post yöntemi kullanırsak, Biz tekrar JSON olarak veri göndermek, ben bir Django Server JSON nesneleri şeklinde mesaj göndermek istiyorum "Ben bir Django sunucusuna mesaj göndermek istiyorum primpap soru tırnak" atıfta .... JSON nesnesi mi gönderiyorum? ... bana bu bilgiyi açıklayabilir misiniz .... ya da konsepti anlamamı sağlayan herhangi bir link yardımcı olacaktır, teşekkürler
Devrath

Yanıtlar:


118

Bunlardan bahsedilmediğine şaşırdım: ama çıplak kemikleri json.org'un küçük paketi ile manuel işlem yerine, GSon ve Jackson'ın kullanımı çok daha uygun. Yani:

Böylece, bazı yarı-düğümlü ağaç düğümleri veya Listeler ve Haritalar'a değil, kendi POJO'larınıza bağlayabilirsiniz. (ve en azından Jackson bu tür şeylere bağlanmaya izin verir (belki de GSON, emin değilim), 'gerçek' nesneler yerine bunları gerçekten istiyorsanız, JsonNode, Harita, Liste)

DÜZENLEME 19-MAR-2014:

Bir başka yeni yarışmacı Jackson jr kütüphanesi: Jackson ( jackson-core) ile aynı hızlı Akış ayrıştırıcısını / jeneratörünü kullanıyor , ancak veri bağlama kısmı küçük (50kB). İşlevsellik daha sınırlıdır (ek açıklama yok, sadece düzenli Java Fasulyeleri), ancak performans açısından hızlı olmalı ve başlatma (ilk çağrı) da çok düşük olmalıdır. Bu nedenle, özellikle küçük uygulamalar için iyi bir seçim olabilir.


10
GSON için +1. Özellikle GSON en akışı desteği kullanmış sites.google.com/site/gson/streaming bizim Android uygulamalarındaki.
Andre Steingress

FWIW, Jackson ayrıca akış API'sı var: wiki.fasterxml.com/JacksonStreamingApi
StaxMan

2
Ayrıca GSON akışı için +1. İlk başta Jackson akışı uygulandı, ancak hata ayıklama sürümünde işlevsel olsa da, ProGuard tonlarca hata üretti ve sürüm sürümü izlemesi zor çökmelere neden oluyor. Eminim bu Jackson ile ilgili bir sorun değil, ama bana iyi çalıştı ve sadece akış için sadece 14kB gerekli GSON geçiş yaptı.
sven

Ve aptal öngörülemeyen json karıştırma dizesi ve listeleri için ex: ["toto", "tata", ["monty", ["tor", "python"]]]? (tüketmek için özyinelemeli fonksiyonlar gerektiren veri yapısı türü)
christophe31

85

Org.json.JSONObject ve org.json.JSONTokener kullanabilirsiniz . bu sınıflar Android SDK ile geldiğinden harici kitaplığa ihtiyacınız yoktur


Hata! Onu özledim. Infact, web sitesindeki org.json kütüphaneleridir.
Gaurav Vaish

Kullandığım şey bu ve bir cazibe gibi çalışıyor.
Adam

Bir örnek veya buna bir bağlantı verilebilirse harika olurdu. Bu şekilde öğrenmek daha kolay. :)
Primal Pappachan


1
Çok daha fazla rahatlık, daha az kod yazmak: düzinelerce yerine bir veya iki satır.
StaxMan

31

GSON'un kullanımı en kolay ve verilerin belirli bir yapıya sahip olması durumunda gidilecek yol.

Gson indirin .

Başvurulan kitaplıklara ekleyin.

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();
        }
    }
}

Posta sınıfı kodu

package com.tut.JSON;

public class Post {

    String message;
    String time;
    String username;
    Bitmap icon;
}

4
Değer için kod basitleştirilebilir: JSONObject dönüşümü gereksizdir. Ve ayarlayıcılar ve alıcılar GSon için isteğe bağlıdır; istenirse eklenebilir, ancak kesinlikle gerekli değildir.
StaxMan

4
Sadece StaxMan'ın açıklamasını netleştirmek için. Örneğiniz jString'i alıp bir JSONObject öğesine dönüştürüyor, sonra gson'un okuması için bir String'e dönüştürüyor. Sadece pst = gson.fromJson (jString, Post.class) kullanın. Bunun aynı zamanda deneme-yakalama ihtiyacından da kurtulacağına inanıyorum. StaxMan'ın da işaret ettiği gibi, Post.class içindeki ayarlayıcılar ve alıcılar değer katmaz. Örneğinizi düzeltmek başkalarına yardımcı olacaktır.
Matt

Çifte dönüşüm bölümünü cevaptan
kaldırdım

4

Bu JsonParser sınıfı

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;

    }

Not: DefaultHttpClient artık sdk 23 tarafından desteklenmediği için bu sdk 21 hedef sdk kullanılması tavsiye edilir.


3

JSON için gerçekten bir şey yok. Kıvırcık parantezler "nesneler" (ilişkisel diziler) ve köşeli parantezler anahtarsız diziler içindir (sayısal olarak dizine eklenmiş). Android ile çalışmak kadarıyla, sdk dahil olanlar için hazır sınıflar vardır (indirme gerekmez).

Bu sınıflara göz atın: http://developer.android.com/reference/org/json/package-summary.html


Sanırım köşeli parantez demek istiyorsun, köşeli parantez değil!
Gaurav Vaish

2

Diğer yanıtlar, Android için popüler eklenti JSON kütüphaneleri olan Jackson ve GSON ve Android'de bulunan çıplak kemikler JSON paketi olan json.org'u kaydetti.

Ancak Android'in artık kendi tam özellikli JSON API'sine sahip olduğunu da belirtmek gerekir.

Bu Honeycomb: API seviye 11'e eklendi.

Bu içerir
- android.util.JsonReader: dokümanlar ve kaynak
- android.util.JsonWriter: dokümanlar ve kaynak

Ayrıca beni Jackson ve GSON'a geri iten ek bir husus daha ekleyeceğim: 3. parti kitaplıkları kullanmak yerine android. * Paketlerini kullanmak için faydalı buldum çünkü yazdığım kod istemci ve sunucu arasında paylaşılabilir. Bu özellikle JSON gibi bir şeyle ilgilidir, burada verileri bir uçtan diğer uca göndermek için JSON'a serileştirmek isteyebilirsiniz. Bunun gibi kullanım durumları için, her iki uçta Java kullanıyorsanız android. * Bağımlılıklarını tanıtmaktan kaçınmanıza yardımcı olur.

Veya sanırım biri ilgili android. * Kaynak kodunu alıp sunucu projenize ekleyebilir, ama bunu denemedim ...


1

Http://json.org (Json-lib veya org.json) adresinden bir kütüphane indirebilir ve JSON'u ayrıştırmak / oluşturmak için kullanabilirsiniz


1

sadece bunu içe aktarman gerekiyor

   import org.json.JSONObject;


  constructing the String that you want to send

 JSONObject param=new JSONObject();
 JSONObject post=new JSONObject();

im iki nesne kullanarak çünkü başka bir jsonObject olabilir

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

sonra yazı json böyle bir başka içine koymak

  param.put("post",post);

bu bir istekte bulunmak için kullandığım yöntem

 makeRequest(param.toString());

public JSONObject makeRequest(String param)
{
    try
    {

bağlantı kurma

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

çıkış akışını ayarlama

        dataOutputStream = new DataOutputStream(connection.getOutputStream());

logcat'te ne gönderdiğimi görmek için bunu kullanıyorum

        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;

burada dize oluşturulur

        while ((line = reader.readLine()) != null)
        {
            result.append(line);
        }

Bu günlüğü yanıtta ne olduğunu görmek için kullanıyorum

         Log.d("INPUTSTREAM: ",result.toString());

sunucu yanıtını içeren Dize ile bir json örneği oluşturma

        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;
}

şimdiden zaman ayırdığınız için teşekkür ederiz. Kodunuzu django sunucusuna base64 kodlu dize göndermek için kullanıyorum, ancak sunucuya göndermek için düğmeyi tıklattığımda APP çöküyor. Bununla nasıl başa çıkabileceğime yardım eder misin?
Noman marwat

0

Eğer android'de hızlı json ayrıştırma arıyorsanız ben size serbestçe kullanılabilir bir araç öneririz.

JSON Sınıfı Oluşturucu aracı

Kullanımı ücretsizdir ve bir-iki saniye içinde tüm json ayrıştırma sınıfınızı oluşturur ..: D


0

GSON vb. Kullanımını teşvik etmek gibi kullanıcılar tarafından halihazırda mükemmel yanıtlar verilmesine rağmen, org.json kullanımını önermek istiyorum . GSON işlevlerinin çoğunu içerir. Ayrıca json dizesini JSONObject'e bir argüman olarak geçirmenize izin verir ve geri kalanıyla ilgilenir, örneğin:

JSONObject json = new JSONObject("some random json string");

Bu işlevsellik onu kişisel favorim yapıyor.


0

Json ayrıştırmak için kullanabileceğiniz farklı açık kaynak kütüphaneleri vardır.

org.json: - Json'u okumak veya yazmak istiyorsanız, bu kütüphaneyi kullanabilirsiniz. İlk önce JsonObject oluşturun: -

JSONObject jsonObj = new JSONObject(<jsonStr>);

Şimdi, değerlerinizi almak için bu nesneyi kullanın: -

String id = jsonObj.getString("id");

Tüm örneği burada görebilirsiniz

Jackson databind: - Json'unuzu belirli POJO sınıfına bağlamak ve ayrıştırmak istiyorsanız, jackson-databind kütüphanesini kullanabilirsiniz, bu json'unuzu POJO sınıfına bağlar: -

ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);

Tüm örneği burada görebilirsiniz

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.