1. 概要

JSON(JavaScript Object Notation)は軽量のデータ交換形式であり、クライアント/サーバー通信に最も一般的に使用されています。読み取り/書き込みが簡単で、言語に依存しません。 JSON値は、別のJSON オブジェクト配列数値文字列ブール値(true / false )またはnull

このチュートリアルでは、利用可能なJSON処理ライブラリの1つである JSON- Java ライブラリ( org.json とも呼ばれます)を使用してJSONを作成、操作、および解析する方法を説明します。 。

2. 前提条件

まず、pom.xmlに次の依存関係を追加する必要があります。

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20180130</version>
</dependency>

最新バージョンは、 Maven CentralRepositoryにあります。

このパッケージはすでにAndroidSDKに含まれているため、同じものを使用している間は含めないでください。

3. JavaでのJSON[パッケージorg.json]

JSON-Javaライブラリはorg.jsonとも呼ばれます(Googleの org.json.simple と混同しないでください)。 JavaでJSONを解析および操作するために使用されます。

さらに、このライブラリは、JSON、XML、HTTPヘッダー、Cookie、カンマ区切りリストまたはテキストなどの間で変換することもできます。

このチュートリアルでは、次のクラスを見ていきます。

  1. JSONObject –JavaのネイティブMap に似たオブジェクトで、順序付けられていないキーと値のペアを格納します
  2. JSONArray –JavaのネイティブVector実装に類似した値の順序付けられたシーケンス
  3. JSONTokener –テキストの一部を一連のトークンに分割するツールで、JSONObjectまたはJSONArrayがJSONを解析するために使用できます文字列
  4. CDL –カンマ区切りのテキストをJSONArrayに変換するメソッドを提供するツール。
  5. Cookie – JSON String からCookieに、またはその逆に変換します。
  6. HTTP – JSON StringからHTTPヘッダーへの変換およびその逆の変換に使用されます
  7. JSONException –このライブラリによってスローされる標準の例外

4. JSONObject

JSONObject は、キーと値のペアの順序付けられていないコレクションであり、JavaのネイティブMap実装に似ています。

  • キーは一意の文字列であり、nullにすることはできません。
  • 値は、ブール値数値文字列、またはJSONArrayからJSONObject.NULLまでの任意の値にすることができます。物体。
  • JSONObject は、キーと値がコロンで区切られ、ペアがコンマで区切られた中括弧で囲まれたStringで表すことができます。
  • JSONObjectを構築するためのいくつかのコンストラクターがあります。

また、次の主な方法もサポートしています。

  1. get(String key) –指定されたキーに関連付けられたオブジェクトを取得し、キーが見つからない場合はJSONExceptionをスローします
  2. opt(String key) –指定されたキーに関連付けられたオブジェクトを取得します。それ以外の場合は null
  3. put(文字列キー、オブジェクト値)– 現在のキーと値のペアを挿入または置換します JSONObject。

put()メソッドは、 String 型のキーと、値に複数の型を受け入れるオーバーロードされたメソッドです。

JSONObject でサポートされているメソッドの完全なリストについては、公式ドキュメントを参照してください。

ここで、このクラスでサポートされている主な操作のいくつかについて説明します。

4.1. JSONObjectから直接JSONを作成する

JSONObject は、JavaのMapインターフェースに類似したAPIを公開します。

put()メソッドを使用して、引数としてキーと値を指定できます。

JSONObject jo = new JSONObject();
jo.put("name", "jon doe");
jo.put("age", "22");
jo.put("city", "chicago");

これで、JSONObjectは次のようになります。

{"city":"chicago","name":"jon doe","age":"22"}

JSONObject.put()メソッドには7つの異なるオーバーロードされたシグニチャがあります。 キーは一意である必要がありますが、null以外の String、値は任意です。

4.2. マップからのJSONの作成

キーと値をJSONObjectに直接配置する代わりに、カスタム Map を作成し、それを引数としてJSONObjectのコンストラクターに渡すことができます。

この例では、上記と同じ結果が得られます。

Map<String, String> map = new HashMap<>();
map.put("name", "jon doe");
map.put("age", "22");
map.put("city", "chicago");
JSONObject jo = new JSONObject(map);

4.3. JSON StringからJSONObjectを作成しています

JSON StringJSONObjectに解析するには、Stringをコンストラクターに渡すだけです。

この例では、上記と同じ結果が得られます。

JSONObject jo = new JSONObject(
  "{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}"
);

渡されるString引数は、有効なJSONである必要があります。 そうしないと、このコンストラクターがJSONExceptionをスローする可能性があります。

4.4. JavaオブジェクトをJSONにシリアル化する

JSONObject’のコンストラクターの1つは、引数としてPOJOを取ります。 以下の例では、パッケージは DemoBean クラスのゲッターを使用し、同じものに適切なJSONObjectを作成します。

JavaオブジェクトからJSONObjectを取得するには、有効な JavaBeanであるクラスを使用する必要があります。

DemoBean demo = new DemoBean();
demo.setId(1);
demo.setName("lorem ipsum");
demo.setActive(true);

JSONObject jo = new JSONObject(demo);

そして、これが JSONObjectjoです。

{"name":"lorem ipsum","active":true,"id":1}

JavaオブジェクトをJSON文字列にシリアル化する方法はありますが、このライブラリを使用して元に戻す方法はありません。 このような柔軟性が必要な場合は、Jacksonなどの他のライブラリに切り替えることができます。

5. JSONArray

JSONArray は、Javaのネイティブ Vector 実装に似た、順序付けられた値のコレクションです。

  • 値は、 Number String Boolean JSONArray 、またはJSONObjectから[ X135X]JSONObject.NULLオブジェクト。
  • これは、角かっこで囲まれた String で表され、コンマで区切られた値のコレクションで構成されます。
  • JSONObject と同様に、ソース String を受け入れ、それを解析してJSONArrayを構築するコンストラクターがあります。

これらは、JSONArrayクラスの主要なメソッドです。

  1. get(int index) –指定されたインデックス(0から全長– 1の間)の値を返します。それ以外の場合は、JSONExceptionをスローします。
  2. opt(int index) –インデックスに関連付けられた値を返します(0から全長– 1の間)。 そのインデックスに値がない場合は、nullが返されます。
  3. put(Object value) –この JSONArrayにオブジェクト値を追加します。このメソッドはオーバーロードされており、さまざまなデータ型をサポートしています。

JSONArrayでサポートされているメソッドの完全なリストについては、公式ドキュメントにアクセスしてください。

5.1. JSONArrayを作成しています

JSONArrayオブジェクトを初期化したら、 put()および get()メソッドを使用して要素を追加および取得するだけです。

JSONArray ja = new JSONArray();
ja.put(Boolean.TRUE);
ja.put("lorem ipsum");

JSONObject jo = new JSONObject();
jo.put("name", "jon doe");
jo.put("age", "22");
jo.put("city", "chicago");

ja.put(jo);

JSONArray の内容は次のとおりです(コードはわかりやすくするためにフォーマットされています)。

[
    true,
    "lorem ipsum",
    {
        "city": "chicago",
        "name": "jon doe",
        "age": "22"
    }
]

5.2. JSON文字列から直接JSONArrayを作成する

JSONObject と同様に、 JSONArray にも、JSON Stringから直接Javaオブジェクトを作成するコンストラクターがあります。

JSONArray ja = new JSONArray("[true, \"lorem ipsum\", 215]");

ソースStringが有効なJSONString でない場合、このコンストラクターはJSONExceptionをスローする可能性があります。

5.3. コレクションまたは配列から直接JSONArrayを作成する

JSONArray のコンストラクターは、コレクションおよび配列オブジェクトも引数としてサポートします。

それらをコンストラクターへの引数として渡すだけで、JSONArrayオブジェクトが返されます。

List<String> list = new ArrayList<>();
list.add("California");
list.add("Texas");
list.add("Hawaii");
list.add("Alaska");

JSONArray ja = new JSONArray(list);

これで、JSONArrayは次のもので構成されます。

["California","Texas","Hawaii","Alaska"]

6. JSONTokener

JSONTokener は、コンストラクターへの入力としてソース String を受け取り、そこから文字とトークンを抽出します。 このパッケージのクラス( JSONObject JSONArray など)によって内部的に使用され、JSON Stringsを解析します。

他のより単純なメソッド( string.toCharArray()など)を使用して同じ機能を実現できるため、このクラスを直接使用する状況は多くない可能性があります。

JSONTokener jt = new JSONTokener("lorem");

while(jt.more()) {
    Log.info(jt.next());
}

これで、 more()メソッドを使用して残りの要素があるかどうかを確認し、 next()を使用して次の要素にアクセスし、イテレータのようにJSONTokenerにアクセスできます。エレメント。

前の例から受け取ったトークンは次のとおりです。

l
o
r
e
m

7. CDL

CDL(コンマ区切りリスト)クラスが提供されており、コンマ区切りテキストをJSONArrayに変換したりその逆を行ったりすることができます。

7.1. カンマ区切りテキストから直接JSONArrayを生成する

カンマ区切りのテキストから直接JSONArrayを生成するには、 JSONTokenerを受け入れる静的メソッドrowToJSONArray()を使用できます。

JSONArray ja = CDL.rowToJSONArray(new JSONTokener("England, USA, Canada"));

JSONArrayの構成は次のとおりです。

["England","USA","Canada"]

7.2. JSONArrayからのコンマ区切りテキストの生成

前の手順を逆にして、JSONArrayからコンマ区切りのテキストを取得する方法を見てみましょう。

JSONArray ja = new JSONArray("[\"England\",\"USA\",\"Canada\"]");
String cdt = CDL.rowToString(ja);

String cdt には、次のものが含まれるようになりました。

England,USA,Canada

7.3. コンマ区切りテキストを使用したJSONObjectJSONArrayの生成

JSONObjectJSONArrayを生成するには、コンマで区切られたヘッダーとデータの両方を含むテキストStringを使用します。

キャリッジリターン(\ r)またはラインフィード(\ n)。を使用して、異なる行を分離します。

最初の行はヘッダーのリストとして解釈され、後続のすべての行はデータとして扱われます。

String string = "name, city, age \n" +
  "john, chicago, 22 \n" +
  "gary, florida, 35 \n" +
  "sal, vegas, 18";

JSONArray result = CDL.toJSONArray(string);

オブジェクトJSONArrayの結果は、次のもので構成されています(わかりやすくするために出力がフォーマットされています)。

[
    {
        "name": "john",
        "city": "chicago",
        "age": "22"
    },
    {
        "name": "gary",
        "city": "florida",
        "age": "35"
    },
    {
        "name": "sal",
        "city": "vegas",
        "age": "18"
    }
]

データとヘッダーの両方が同じString内で提供されていることに注意してください。 これを行う別の方法があります。JSONArrayを指定してヘッダーを取得し、コンマ区切りの文字列をデータとして使用することで、同じ機能を実現できます。

ここでも、キャリッジリターン(\ r)またはラインフィード(\ n)を使用して異なる行を分離します。

JSONArray ja = new JSONArray();
ja.put("name");
ja.put("city");
ja.put("age");

String string = "john, chicago, 22 \n"
  + "gary, florida, 35 \n"
  + "sal, vegas, 18";

JSONArray result = CDL.toJSONArray(ja, string);

ここでは、オブジェクトresultの内容を以前とまったく同じように取得します。

8. クッキー

Cookie クラスはWebブラウザのCookieを処理し、ブラウザのCookieをJSONObjectに変換するメソッドとその逆のメソッドを備えています。

Cookieクラスの主なメソッドは次のとおりです。

  1. toJsonObject(String sourceCookie)–はCookie文字列をJSONObjectに変換します
  2. toString(JSONObject jo) –前のメソッドの逆で、JSONObjectをCookieStringに変換します

8.1. Cookie StringJSONObjectに変換する

Cookie StringJSONObjectに変換するには、静的メソッド Cookie.toJSONObject()を使用します。

String cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; path=/";
JSONObject cookieJO = Cookie.toJSONObject(cookie);

8.2. JSONObjectをCookieStringに変換する

次に、JSONObjectをCookieStringに変換します。 これは前のステップの逆です。

String cookie = Cookie.toString(cookieJO);

9. HTTP

HTTP クラスには、HTTPヘッダーをJSONObjectに変換するために使用される静的メソッドが含まれています。

このクラスには、2つの主要なメソッドもあります。

  1. toJsonObject(String sourceHttpHeader)–HttpHeaderStringJSONObjectに変換します
  2. toString(JSONObject jo) –提供されたJSONObjectStringに変換します

9.1. JSONObjectをHTTPヘッダーに変換する

HTTP.toString()メソッドは、JSONObjectをHTTPヘッダーStringに変換するために使用されます。

JSONObject jo = new JSONObject();
jo.put("Method", "POST");
jo.put("Request-URI", "http://www.example.com/");
jo.put("HTTP-Version", "HTTP/1.1");
String httpStr = HTTP.toString(jo);

StringhttpStrの構成は次のとおりです。

POST "http://www.example.com/" HTTP/1.1

HTTPリクエストヘッダーを変換する際、 JSONObjectには「Method」「Request-URI」、「HTTP-Version」[ X152X]キー。 また、応答ヘッダーの場合、オブジェクトには「HTTP-Version」「Status-Code」、および「Reason-Phrase」パラメーターが含まれている必要があります。

9.2. HTTPヘッダーStringJSONObjectに変換し直します

ここでは、前の手順で取得したHTTP文字列を、その手順で作成したJSONObjectに変換します。

JSONObject obj = HTTP.toJSONObject("POST \"http://www.example.com/\" HTTP/1.1");

10. JSONException

JSONException は、エラーが発生したときにこのパッケージによってスローされる標準の例外です。

これは、このパッケージのすべてのクラスで使用されます。 例外の後には通常、何がうまくいかなかったかを示すメッセージが続きます。

11. 結論

この記事では、Javaを使用したJSON( org.json )について説明し、ここで利用できるコア機能のいくつかに焦点を当てました。

この記事で使用されている完全なコードスニペットは、GitHubにあります。