AndroidでのJSONオブジェクトの送信と解析[終了]


137

JSONオブジェクトの形式でサーバーにメッセージを送信し、サーバーからのJSON応答を解析したいと思います。

JSONオブジェクトの例

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

属性ごとに移動して、JSONを手動で解析しようとしています。このプロセスを簡単にするために使用できるライブラリ/ユーティリティはありますか?


2
そのURLはもう利用できません...更新できますか?
Cipi

1
詳細な例は次のとおりです。Android– JSON解析の例
Paresh Mayani '18

1
@ Paresh Mayani&@ primpap .. getメソッドを使用してサーバーから受信したJSONを使用してサーバーからデータを入力できることはわかっていますが、私はそれに慣れています....しかし、postメソッドを使用してデータをサーバーに送信する場合、データをもう一度JSONとして送信します。私はprimpap質問の引用を参照しています。「メッセージをJSONオブジェクトの形式でDjangoサーバーに送信したい」.....サーバーでMysqlを使用しています....またはJSONオブジェクトを送信しますか?...この情報を私に明確にしてくれませんか....またはコンセプトを理解するのに役立つリンクがあれば役に立ちます。ありがとう
Devrath 2013

回答:


118

私はこれらが言及されていないことに驚いています:しかし、json.orgの小さなパッケージで裸の骨ではなく手動のプロセスを使用する代わりに、GSonとJacksonを使用するほうがはるかに便利です。そう:

そのため、実際には、半端なツリーノードやリストやマップではなく、独自のPOJOにバインドできます。(そして少なくともジャクソンはそのようなもの(おそらくGSONも同様に、確かではありません)、JsonNode、マップ、リスト、あなたが本当に「実際の」オブジェクトの代わりにこれらを必要とする場合にバインドすることを許可します)

2014年3月19日編集:

もう1つの新しい候補は、Jackson jrライブラリです。Jackson(jackson-core)と同じ高速ストリーミングパーサー/ジェネレーターを使用しますが、データバインディング部分はごくわずか(50 kB)です。機能はより制限されます(アノテーションはなく、通常のJava Beanのみ)。ただし、パフォーマンスは高速で、初期化(初回呼び出し)のオーバーヘッドも非常に低いはずです。そのため、特に小さいアプリの場合は、それがちょうど良い選択になるかもしれません。


10
GSONの+1。私たちは特にAndroidアプリでGSONのストリーミングサポートsites.google.com/site/gson/streamingを使用しました 。
Andre Steingress、2011

FWIW、ジャクソンにもストリーミングAPIがあります:wiki.fasterxml.com/JacksonStreamingApi
StaxMan

2
GSONストリーミングの場合も+1。最初はジャクソンストリーミングを実装しましたが、デバッグバージョンでは機能しましたが、ProGuardは大量のエラーとリリースバージョンを生成し、クラッシュを追跡するのは困難です。これはジャクソン関連の問題ではないと私は確信していますが、GSONに切り替えることができました。GSONは正常に機能し、ストリーミングだけで追加の14kBを必要としました。
sven

そして、愚かな予測不可能なjsonの混合文字列とリストの例:["toto"、 "tata"、["monty"、["tor"、 "python"]]]?(それを消費するために再帰関数を必要とするデータ構造の種類)
christophe31

85

org.json.JSONObjectおよびorg.json.JSONTokenerを使用できます。これらのクラスにはAndroid SDKが付属しているため、外部ライブラリは必要ありません


おっとっと!私は逃しました。実際、これらはWebサイト上のorg.jsonライブラリです。
Gaurav Vaish

これは私が使うもので、魅力のように機能します。
アダム

例やそれへのリンクを与えることができれば素晴らしいでしょう。その方法を学ぶのは簡単です。:)
Primal Pappachan、2010年


1
はるかに便利で、書くコードが少なくて済みます。数十行ではなく1行または2行です。
StaxMan 2010

31

GSONが最も使いやすく、データが明確な構造を持っている場合の方法です。

gsonをダウンロードします

参照ライブラリに追加します。

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

Postクラスのコード

package com.tut.JSON;

public class Post {

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

4
価値があるのは、コードを単純化することです。JSONObject変換は不要です。また、GSonではセッターとゲッターはオプションです。必要に応じて追加できますが、必須ではありません。
StaxMan

4
StaxManのコメントを明確にするために。あなたの例はjStringを取り、それをJSONObjectに変換し、次にそれをgsonが読み取るためにStringに変換します。単にpst = gson.fromJson(jString、Post.class)を使用します。これにより、try-catchの必要性もなくなると思います。StaxManも指摘しているように、Post.classのセッターとゲッターは値を追加しません。あなたの例を訂正することは他の人に役立つでしょう。
マット

私は答えから二重変換部分を削除しました
whlk

4

これは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;

    }

注:DefaultHttpClientはSDK 23でサポートされなくなったため、このコードでターゲットSDK 21を使用することをお勧めします。


3

JSONには特に何もありません。中括弧は「オブジェクト」(連想配列)用で、角括弧はキーのない配列(数値でインデックス付けされたもの)用です。Androidでの作業に関しては、SDKに含まれているクラス用の既製のクラスがあります(ダウンロードは不要です)。

これらのクラスを確認してください:http : //developer.android.com/reference/org/json/package-summary.html


あなたは角括弧ではなく中括弧を意味していたと思います!
Gaurav Vaish

2

他の回答では、JacksonとGSON-Android向けの人気のあるアドオンJSONライブラリ、およびAndroidに含まれている最小限のJSONパッケージであるjson.orgに言及しています。

しかし、Androidが独自のフル機能のJSON APIを備えていることも注目に値すると思います。

これはHoneycomb:APIレベル11で追加されました。

これは
-android.util.JsonReader:docssource
-android.util.JsonWriter:docssourceで構成されています

また、JacksonとGSONに戻るための考慮事項を1つ追加します。作成したコードはクライアントとサーバー間で共有できるため、android。*パッケージではなくサードパーティライブラリを使用すると便利です。これは、JSONのようなものに特に関連しており、一方の端でデータをJSONにシリアル化して、もう一方の端に送信することができます。このようなユースケースでは、両端でJavaを使用すると、android。*依存関係の導入を回避するのに役立ちます。

または、関連するandroid。*ソースコードを取得してサーバープロジェクトに追加できると思いますが、まだ試していません...



1

これをインポートするだけです

   import org.json.JSONObject;


  constructing the String that you want to send

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

別の中にjsonObjectを含めることができるため、2つのオブジェクトを使用しています

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

それから私はこのような別の中に投稿jsonを入れます

  param.put("post",post);

これは私がリクエストをするのに使う方法です

 makeRequest(param.toString());

public JSONObject makeRequest(String param)
{
    try
    {

接続の設定

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

出力ストリームの設定

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

これを使用して、logcatで何を送信しているかを確認します

        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;

ここで文字列が構築されます

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

このログを使用して、応答で何が発生するかを確認します

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

サーバー応答を含む文字列でjsonをインスタンス化する

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

よろしくお願いします。私はbase64エンコードされた文字列をdjangoサーバーに送信するためにあなたのコードを使用していますが、ボタンをクリックしてサーバーに送信すると、APPがクラッシュします。これに取り組む方法を手伝ってくれませんか?
Noman marwat

0

あなたがAndroidで高速json解析を探しているなら、私は自由に利用できるツールを提案します。

JSON Class Creatorツール

それは無料で使用でき、すべてのjson解析クラスを1〜2秒以内に作成します。


0

GSONの使用を奨励するなど、ユーザーから優れた回答が既に提供されていますが、org.jsonの使用を提案したいと思います。ほとんどのGSON機能が含まれています。また、json文字列をJSONObjectの引数として渡すことができ、残りの処理も行います。例:

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

この機能は、私のお気に入りです。


0

jsonの解析に使用できるさまざまなオープンソースライブラリがあります。

org.json:-jsonを読み書きする場合は、このライブラリを使用できます。最初にJsonObjectを作成します:-

JSONObject jsonObj = new JSONObject(<jsonStr>);

次に、このオブジェクトを使用して値を取得します:-

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

ここで完全な例を見ることができます

Jackson databind: -jsonを特定のPOJOクラスにバインドして解析する場合は、jackson-databindライブラリを使用できます。これにより、jsonがPOJOクラスにバインドされます。

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

ここで完全な例を見ることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.