JSON-Java(org.json)の概要
1. JSON-Javaの概要
JSON(JavaScript Object Notationの頭字語)は軽量のデータ交換形式であり、most commonly used for client-server communication.です。読み取り/書き込みが簡単で、言語に依存しません。 JSON値は、別のJSONobject, array, number, string, boolean(true / false)またはnull.にすることができます
このチュートリアルでは、利用可能なJSON処理ライブラリの1つを使用してJSONを作成、操作、解析する方法を説明します。つまり、JSON-Javaライブラリはorg.json.とも呼ばれます。
参考文献:
2. 前提条件
始める前に、pom.xmlに次の依存関係を追加する必要があります。
org.json
json
20180130
最新バージョンはMaven Central repository.にあります
このパッケージはすでにAndroidSDKに含まれているため、同じパッケージを使用している間は含めないでください。
3. JavaでのJSON [パッケージorg.json]
JSON-Javaライブラリはorg.jsonとも呼ばれ(Googleのorg.json.simpleと混同しないでください)、JavaでJSONを解析および操作するために使用されるクラスを提供します。
さらに、このライブラリは、JSON、XML、HTTPヘッダー、Cookie、カンマ区切りリストまたはテキストなどの間で変換することもできます。
このチュートリアルでは、次のことを確認します。
-
JSONObject –順序付けられていないキーと値のペアを格納するオブジェクトのようなJavaのネイティブMapに似ています
-
JSONArray –JavaのネイティブVector実装と同様の順序付けられた値のシーケンス
-
JSONTokener –テキストの一部を一連のtokensに分割するツールで、JSONObjectまたはJSONArrayがJSON文字列を解析するために使用できます。
-
CDL –コンマ区切りのテキストをJSONArrayに、またはその逆に変換するメソッドを提供するツール
-
Cookie – JSONStringからCookieに、またはその逆に変換します。
-
HTTP – JSONStringからHTTPヘッダーへの変換およびその逆の変換に使用されます
-
JSONException –これはこのライブラリによってスローされる標準の例外です
4. JSONObject
JSONObjectは、キーと値のペアの順序付けられていないコレクションであり、JavaのネイティブMap実装に似ています。
-
キーは一意のStringsであり、nullにすることはできません。
-
値は、Boolean、Number、String、JSONArray、またはJSONObject.NULLオブジェクトのいずれでもかまいません。
-
JSONObjectは、キーと値がコロンで区切られ、ペアがコンマで区切られた中括弧で囲まれたStringで表すことができます。
-
JSONObjectを構築するためのコンストラクターがいくつかあります
また、次の主要なメソッドもサポートしています。
-
get(String key) – gは、指定されたキーに関連付けられたオブジェクトを設定し、キーが見つからない場合はJSONExceptionをスローします
-
opt(String key)- gは、指定されたキーに関連付けられたオブジェクトを設定します。それ以外の場合は、nullを設定します。
-
put(String key, Object value) –は、現在のJSONObject.のキーと値のペアを挿入または置換します
put()メソッドは、タイプStringのキーと値の複数のタイプを受け入れるオーバーロードされたメソッドです。
JSONObject、visit the official documentation.でサポートされているメソッドの完全なリストについては
次に、このクラスでサポートされている主な操作のいくつかについて説明します。
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 map = new HashMap<>();
map.put("name", "jon doe");
map.put("age", "22");
map.put("city", "chicago");
JSONObject jo = new JSONObject(map);
4.3. JSONStringからJSONObjectを作成する
JSONStringをJSONObjectに解析するには、Stringをコンストラクターに渡すだけです。
この例では、上記と同じ結果が生成されます。
JSONObject jo = new JSONObject(
"{\"city\":\"chicago\",\"name\":\"jon doe\",\"age\":\"22\"}"
);
渡されるString引数は有効なJSONである必要があります。そうでない場合、このコンストラクターはJSONExceptionをスローする可能性があります。
4.4. JavaオブジェクトをJSONにシリアル化する
JSONObject'sコンストラクターの1つは、引数としてPOJOを取ります。 以下の例では、パッケージはDemoBeanクラスのゲッターを使用し、同じものに適切なJSONObjectを作成します。
JavaオブジェクトからJSONObjectを取得するには、有効なJava Beanであるクラスを使用する必要があります。
DemoBean demo = new DemoBean();
demo.setId(1);
demo.setName("lorem ipsum");
demo.setActive(true);
JSONObject jo = new JSONObject(demo);
この例のJSONObject joは次のようになります。
{"name":"lorem ipsum","active":true,"id":1}
JavaオブジェクトをJSON文字列にシリアル化する方法はありますが、このライブラリを使用してJavaオブジェクトを元に戻す方法はありません。
そのような柔軟性が必要な場合は、Jacksonなどの他のライブラリに切り替えることができます。
5. JSONArray
JSONArrayは、JavaのネイティブVector実装に似た、順序付けられた値のコレクションです。
-
値は、Number、String、Boolean、JSONArray、JSONObject、またはJSONObject.NULLオブジェクトのいずれでもかまいません。
-
角かっこで囲まれたStringで表され、カンマで区切られた値のコレクションで構成されます
-
JSONObjectと同様に、ソースStringを受け入れ、それを解析してJSONArrayを構築するコンストラクターがあります。
以下は、JSONArrayクラスの主要なメソッドです。
-
get(int index) – rは、指定されたインデックス(0から全長– 1の間)の値を返します。それ以外の場合は、JSONExceptionをスローします。
-
opt(int index) –インデックスに関連付けられた値を返します(0から全長– 1の間)。 そのインデックスに値がない場合は、nullが返されます
-
put(Object value) –このJSONArray.にオブジェクト値を追加します。このメソッドはオーバーロードされており、さまざまなデータ型をサポートしています。
JSONArrayでサポートされているメソッドの完全なリストについては、visit the official documentation.
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にもJSONStringから直接Javaオブジェクトを作成するコンストラクターがあります。
JSONArray ja = new JSONArray("[true, \"lorem ipsum\", 215]");
ソースStringが有効なJSONStringでない場合、このコンストラクターはJSONExceptionをスローする可能性があります。
5.3. コレクションまたは配列から直接JSONArrayを作成する
JSONArrayのコンストラクターは、コレクションオブジェクトと配列オブジェクトも引数としてサポートします。
それらを引数としてコンストラクターに渡すだけで、JSONArrayオブジェクトが返されます。
List 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を受け取り、そこから文字とトークンを抽出します。 JSONStrings.を解析するために、このパッケージのクラス(JSONObject、JSONArrayなど)によって内部的に使用されます
他のより単純なメソッド(string.toCharArray()など)を使用して同じ機能を実現できるため、このクラスを直接使用する状況は多くない場合があります。
JSONTokener jt = new JSONTokener("lorem");
while(jt.more()) {
Log.info(jt.next());
}
これで、more()メソッドを使用して残りの要素があるかどうかを確認し、next()を使用して次の要素にアクセスし、イテレータのようにJSONTokenerにアクセスできます。
前の例から受け取ったトークンは次のとおりです。
l
o
r
e
m
7. CDL
カンマ区切りのテキストをJSONArrayに、またはその逆に変換するためのCDL(Comma Delimited List)クラスが提供されています。
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);
Stringcdtには次のものが含まれています。
England,USA,Canada
7.3. コンマ区切りテキストを使用してJSONObjectsのJSONArrayを生成する
JSONObjectsのJSONArrayを生成するには、ヘッダーとデータの両方をコンマで区切ったテキストStringを使用します。
異なる行は、キャリッジリターン( )またはラインフィード( ).を使用して区切られます
最初の行はヘッダーのリストとして解釈され、後続のすべての行はデータとして扱われます。
String string = "name, city, age \n" +
"john, chicago, 22 \n" +
"gary, florida, 35 \n" +
"sal, vegas, 18";
JSONArray result = CDL.toJSONArray(string);
オブジェクトJSONArray resultは、(わかりやすくするためにフォーマットされた出力)で構成されています。
[
{
"name": "john",
"city": "chicago",
"age": "22"
},
{
"name": "gary",
"city": "florida",
"age": "35"
},
{
"name": "sal",
"city": "vegas",
"age": "18"
}
]
この例では、データとヘッダーの両方が同じString.There’s an alternative way of doing this where we can achieve the same functionality by supplying a JSONArray that would be used to get the headers and a comma-delimited String working as the data.内で提供されていることに注意してください。
キャリッジリターン( )またはラインフィード( ):を使用して、異なる行を区切ります。
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クラスの主なメソッドは次のとおりです。
-
toJsonObject(String sourceCookie) –はCookie文字列をJSONObjectに変換します
-
toString(JSONObject jo) –これは前の方法の逆で、JSONObjectをCookieStringに変換します。
8.1. CookieStringをJSONObjectに変換する
CookieをStringからJSONObjectに変換するには、静的メソッド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つの主要なメソッドもあります。
-
toJsonObject(String sourceHttpHeader) –はHttpHeader StringをJSONObjectに変換します
-
toString(JSONObject jo) –指定されたJSONObjectをStringに変換します
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);
ここで、String httpStrは次のもので構成されます。
POST "http://www.example.com/" HTTP/1.1
HTTPリクエストヘッダーの変換中、JSONObjectには“Method”,“Request-URI”キーと“HTTP-Version”キーが含まれている必要がありますが、レスポンスヘッダーの場合、オブジェクトには“HTTP-Version”,が含まれている必要があります。 “Status-Code”および“Reason-Phrase”パラメータ。
9.2. HTTPヘッダーStringをJSONObjectに戻す
ここでは、前のステップで取得したHTTP文字列を、そのステップで作成したJSONObjectに変換し直します。
JSONObject obj = HTTP.toJSONObject("POST \"http://www.example.com/\" HTTP/1.1");
10. JSONException
JSONExceptionは、エラーが発生したときにこのパッケージによってスローされる標準の例外です。
これは、このパッケージのすべてのクラスで使用されます。 通常、例外の後には、正確に何が間違っていたかを示すメッセージが続きます。
11. 結論
このチュートリアルでは、Javaを使用したJSON(org.json)を確認し、ここで利用できるコア機能のいくつかに焦点を当てました。
この記事で使用されている完全なコードスニペットは、over on GitHubにあります。