Android
JSON with Android with org.json
サーチ…
構文
オブジェクト :オブジェクトは名前と値のペアの順序付けられていないセットです。オブジェクトは{(左中括弧)で始まり}(右中括弧)で終わります。それぞれの名前の後に:(コロン)と名前/値のペアが、(カンマ)で区切られます。
配列 :配列は順序付けられた値の集合です。配列は[(左括弧)で始まり、](右括弧)で終わります。値は、(カンマ)で区切られます。
値 :値は、二重引用符で囲まれた文字列、数字、または真または偽またはヌル、またはオブジェクトまたは配列です。これらの構造は入れ子にすることができます。
文字列 :文字列は、バックスラッシュエスケープを使用して二重引用符で囲まれた0以上のUnicode文字のシーケンスです。文字は単一の文字列として表されます。文字列はCまたはJava文字列に非常に似ています。
Number :8進数と16進数の書式が使用されていないことを除いて、数字はCまたはJavaの数字によく似ています。
備考
このトピックでは、Android SDKに含まれているorg.json
パッケージの使用について説明します。
単純なJSONオブジェクトを解析する
以下のJSON文字列を考えてみましょう:
{
"title": "test",
"content": "Hello World!!!",
"year": 2016,
"names" : [
"Hannah",
"David",
"Steve"
]
}
このJSONオブジェクトは、次のコードを使用して解析できます。
try {
// create a new instance from a string
JSONObject jsonObject = new JSONObject(jsonAsString);
String title = jsonObject.getString("title");
String content = jsonObject.getString("content");
int year = jsonObject.getInt("year");
JSONArray names = jsonObject.getJSONArray("names"); //for an array of String objects
} catch (JSONException e) {
Log.w(TAG,"Could not parse JSON. Error: " + e.getMessage());
}
JSONObjectの内部にネストされたJSONArrayを使用した別の例を次に示します。
{
"books":[
{
"title":"Android JSON Parsing",
"times_sold":186
}
]
}
これは、次のコードで解析できます。
JSONObject root = new JSONObject(booksJson);
JSONArray booksArray = root.getJSONArray("books");
JSONObject firstBook = booksArray.getJSONObject(0);
String title = firstBook.getString("title");
int timesSold = firstBook.getInt("times_sold");
シンプルなJSONオブジェクトの作成
空のコンストラクタを使用してJSONObject
を作成し、異なるタイプで使用できるようにオーバーロードされたput()
メソッドを使用してフィールドを追加します。
try {
// Create a new instance of a JSONObject
final JSONObject object = new JSONObject();
// With put you can add a name/value pair to the JSONObject
object.put("name", "test");
object.put("content", "Hello World!!!1");
object.put("year", 2016);
object.put("value", 3.23);
object.put("member", true);
object.put("null_value", JSONObject.NULL);
// Calling toString() on the JSONObject returns the JSON in string format.
final String json = object.toString();
} catch (JSONException e) {
Log.e(TAG, "Failed to create JSONObject", e);
}
結果のJSON
文字列は次のようになりJSON
。
{
"name":"test",
"content":"Hello World!!!1",
"year":2016,
"value":3.23,
"member":true,
"null_value":null
}
JSONObjectにJSONArrayを追加する
// Create a new instance of a JSONArray
JSONArray array = new JSONArray();
// With put() you can add a value to the array.
array.put("ASDF");
array.put("QWERTY");
// Create a new instance of a JSONObject
JSONObject obj = new JSONObject();
try {
// Add the JSONArray to the JSONObject
obj.put("the_array", array);
} catch (JSONException e) {
e.printStackTrace();
}
String json = obj.toString();
結果のJSON文字列は次のようになります。
{
"the_array":[
"ASDF",
"QWERTY"
]
}
null値を持つJSON文字列を作成します。
次のように値がnull
JSON文字列を生成する必要がある場合:
{
"name":null
}
次に、特別な定数JSONObject.NULLを使用する必要があります。
機能例:
jsonObject.put("name", JSONObject.NULL);
jsonの解析時にnull-stringを使用する
{
"some_string": null,
"ather_string": "something"
}
この方法で使用する場合:
JSONObject json = new JSONObject(jsonStr);
String someString = json.optString("some_string");
我々は出力を持っています:
someString = "null";
したがって、この回避策を提供する必要があります。
/**
* According to http://stackoverflow.com/questions/18226288/json-jsonobject-optstring-returns-string-null
* we need to provide a workaround to opt string from json that can be null.
* <strong></strong>
*/
public static String optNullableString(JSONObject jsonObject, String key) {
return optNullableString(jsonObject, key, "");
}
/**
* According to http://stackoverflow.com/questions/18226288/json-jsonobject-optstring-returns-string-null
* we need to provide a workaround to opt string from json that can be null.
* <strong></strong>
*/
public static String optNullableString(JSONObject jsonObject, String key, String fallback) {
if (jsonObject.isNull(key)) {
return fallback;
} else {
return jsonObject.optString(key, fallback);
}
}
それから、
JSONObject json = new JSONObject(jsonStr);
String someString = optNullableString(json, "some_string");
String someString2 = optNullableString(json, "some_string", "");
期待どおりの成果をあげることができます:
someString = null; //not "null"
someString2 = "";
JsonReaderを使用してストリームからJSONを読み込む
JsonReader
はJSONでエンコードされた値をトークンのストリームとして読み込みます。
public List<Message> readJsonStream(InputStream in) throws IOException {
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
try {
return readMessagesArray(reader);
} finally {
reader.close();
}
}
public List<Message> readMessagesArray(JsonReader reader) throws IOException {
List<Message> messages = new ArrayList<Message>();
reader.beginArray();
while (reader.hasNext()) {
messages.add(readMessage(reader));
}
reader.endArray();
return messages;
}
public Message readMessage(JsonReader reader) throws IOException {
long id = -1;
String text = null;
User user = null;
List<Double> geo = null;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("id")) {
id = reader.nextLong();
} else if (name.equals("text")) {
text = reader.nextString();
} else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
geo = readDoublesArray(reader);
} else if (name.equals("user")) {
user = readUser(reader);
} else {
reader.skipValue();
}
}
reader.endObject();
return new Message(id, text, user, geo);
}
public List<Double> readDoublesArray(JsonReader reader) throws IOException {
List<Double> doubles = new ArrayList<Double>();
reader.beginArray();
while (reader.hasNext()) {
doubles.add(reader.nextDouble());
}
reader.endArray();
return doubles;
}
public User readUser(JsonReader reader) throws IOException {
String username = null;
int followersCount = -1;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("name")) {
username = reader.nextString();
} else if (name.equals("followers_count")) {
followersCount = reader.nextInt();
} else {
reader.skipValue();
}
}
reader.endObject();
return new User(username, followersCount);
}
ネストされたJSONオブジェクトを作成する
ネストされたJSONオブジェクトを生成するには、別のJSONオブジェクトを追加するだけです。
JSONObject mainObject = new JSONObject(); // Host object
JSONObject requestObject = new JSONObject(); // Included object
try {
requestObject.put("lastname", lastname);
requestObject.put("phone", phone);
requestObject.put("latitude", lat);
requestObject.put("longitude", lon);
requestObject.put("theme", theme);
requestObject.put("text", message);
mainObject.put("claim", requestObject);
} catch (JSONException e) {
return "JSON Error";
}
今mainObject
と呼ばれるキーが含まclaim
全体でrequestObject
値としてを。
JSONレスポンスの動的キーの処理
これは、応答用の動的キーを処理する方法の例です。ここでA
とB
は動的キーです。何でもかまいません
応答
{
"response": [
{
"A": [
{
"name": "Tango"
},
{
"name": "Ping"
}
],
"B": [
{
"name": "Jon"
},
{
"name": "Mark"
}
]
}
]
}
Javaコード
// ResponseData is raw string of response
JSONObject responseDataObj = new JSONObject(responseData);
JSONArray responseArray = responseDataObj.getJSONArray("response");
for (int i = 0; i < responseArray.length(); i++) {
// Nodes ArrayList<ArrayList<String>> declared globally
nodes = new ArrayList<ArrayList<String>>();
JSONObject obj = responseArray.getJSONObject(i);
Iterator keys = obj.keys();
while(keys.hasNext()) {
// Loop to get the dynamic key
String currentDynamicKey = (String)keys.next();
// Get the value of the dynamic key
JSONArray currentDynamicValue = obj.getJSONArray(currentDynamicKey);
int jsonArraySize = currentDynamicValue.length();
if(jsonArraySize > 0) {
for (int ii = 0; ii < jsonArraySize; ii++) {
// NameList ArrayList<String> declared globally
nameList = new ArrayList<String>();
if(ii == 0) {
JSONObject nameObj = currentDynamicValue.getJSONObject(ii);
String name = nameObj.getString("name");
System.out.print("Name = " + name);
// Store name in an array list
nameList.add(name);
}
}
}
nodes.add(nameList);
}
}
JSONでのフィールドの有無を確認する
場合JSONException
は、コード上にJSONException
が発生するのを避けるために、フィールドがJSON上に存在するかどうかを確認すると便利です。
これを実現するには、次の例のように、 JSONObject#has(String)
またはメソッドを使用します。
サンプルJSON
{
"name":"James"
}
Javaコード
String jsonStr = " { \"name\":\"James\" }";
JSONObject json = new JSONObject(jsonStr);
// Check if the field "name" is present
String name, surname;
// This will be true, since the field "name" is present on our JSON.
if (json.has("name")) {
name = json.getString("name");
}
else {
name = "John";
}
// This will be false, since our JSON doesn't have the field "surname".
if (json.has("surname")) {
surname = json.getString("surname");
}
else {
surname = "Doe";
}
// Here name == "James" and surname == "Doe".
JSONの要素を更新する
サンプルjsonを更新する
{
"student":{"name":"Rahul", "lastname":"sharma"},
"marks":{"maths":"88"}
}
jsonの要素値を更新するには、値を割り当てて更新する必要があります。
try {
// Create a new instance of a JSONObject
final JSONObject object = new JSONObject(jsonString);
JSONObject studentJSON = object.getJSONObject("student");
studentJSON.put("name","Kumar");
object.remove("student");
object.put("student",studentJSON);
// Calling toString() on the JSONObject returns the JSON in string format.
final String json = object.toString();
} catch (JSONException e) {
Log.e(TAG, "Failed to create JSONObject", e);
}
更新された値
{
"student":{"name":"Kumar", "lastname":"sharma"},
"marks":{"maths":"88"}
}