Android原生json類org.json.JSONObject初歩使用
Androidオリジナルjsonクラスは簡単ないくつかの方法しか提供されておらず、beanを内蔵した操作もありませんが、実はandroidオリジナルなので、サポートしたほうがいいです.例えば、サーバ側でよく使われるjson-libというライブラリは、json-libの依存パッケージcommons-collectionがサポートできないためandroidでは使用できません.
まず、最も一般的な方法は、json文字列からキー名に基づいて対応する値を取得することです.
1、new JSONObjectオブジェクト、構造にjson文字列を入れる
2、jsonObjectオブジェクトのgetString(「属性名」)、getInt(「属性名」)、またはget(「属性名」)メソッドで対応する値を得る
json文字列をjava対応クラスのオブジェクトに解析したい場合は、jsonObjectのオリジナルメソッドは期待できませんが、jsonObjectクラスを継承し、反射を利用してjson文字列をオブジェクトに変換するメソッドを追加することができます.この継承クラスは次のようになります.
これにより、元のjsonObjectクラスよりもgetBeanメソッドが1つ多くなり、classファイルを1つ転送するだけで済みます.
注意:転送されたclassは内部クラスにはできません!!!
注意:転送されたclassは内部クラスにはできません!!!
注意:転送されたclassは内部クラスにはできません!!!
重要なことを3回話して、簡単にテストしてみましょう.
まず簡単なjavaクラスを書きます
注意:javaクラスにget、setメソッドは必要ありません
json文字列のフォーマットが間違っていなければ、許容すれば成功するはずです.intタイプのjson文字列に二重引用符をつけないでください.この原生類はまだ自動的にparseIntを行うことができません.
原生にはもう一つのjsonArrayがあり、その中でよく使われる機能はget(下付き)で、この配列が下付きの値(object)に対応することを取り出すために使われています.
対応するjavaクラスを取得するための2つの方法も追加しました
これがあれば、ちょっと遍歴するだけでjson配列の各クラスを1つずつ取り出すことができますが、この配列には1つのタイプのオブジェクトしか保存できないことが条件で、次のテストをします.
ではどのようにJsonObjectで1つのjson文字列を生成して、答えは1つの属性の1つの属性の上へputだけで、jsonObjectも普通のクラスがjsonの方法を回転することを提供していません
次のようになります.
出力結果:{"age":12,"name":"jack"}
では、先ほどの考え方に従って、私たちがカスタマイズしたSituJsonObjectに方法を加えて、反射でクラスのすべてのメンバーを書きます.このクラスをwriteBeanと呼んでもいいです.
注意:この方法はjavaクラスにget、setメソッドがある必要はありません.
簡単な書き込みテストを行います.
テスト結果:{"age":14,"name":"lixiao"}
json文字列配列を生成するには、単一オブジェクトのjson文字列を単純に加算すれば良いので、JSOnArrayクラスを使用する必要はありません
jsonObjectにもう一つの方法を追加してgetArrayStringと呼びましょう.list
まず、最も一般的な方法は、json文字列からキー名に基づいて対応する値を取得することです.
1、new JSONObjectオブジェクト、構造にjson文字列を入れる
2、jsonObjectオブジェクトのgetString(「属性名」)、getInt(「属性名」)、またはget(「属性名」)メソッドで対応する値を得る
JSONObject jsonObject;
try {
jsonObject = new JSONObject("{name:'jack',age:12}");
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
System.out.println(name+age);
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
json文字列をjava対応クラスのオブジェクトに解析したい場合は、jsonObjectのオリジナルメソッドは期待できませんが、jsonObjectクラスを継承し、反射を利用してjson文字列をオブジェクトに変換するメソッドを追加することができます.この継承クラスは次のようになります.
package com.example.http_test;
import java.lang.reflect.Field;
import org.json.JSONObject;
public class SituJsonObject extends JSONObject {
public SituJsonObject(String jsonString) throws Exception{
super(jsonString);
}
/**
* json java
* @param cls
* @return
* @throws Exception
*/
public Object getBean(Class cls) throws Exception
{
//
Object obj = cls.newInstance();
//
Field[] fs = cls.getDeclaredFields();
// , json ,
for (int i = 0; i < fs.length; i++) {
String name = fs[i].getName();
fs[i].setAccessible(true);//
// json
Object value = this.get(name);
if(value==null)continue;
//
fs[i].set(obj, value);
}
return obj;
}
}
これにより、元のjsonObjectクラスよりもgetBeanメソッドが1つ多くなり、classファイルを1つ転送するだけで済みます.
注意:転送されたclassは内部クラスにはできません!!!
注意:転送されたclassは内部クラスにはできません!!!
注意:転送されたclassは内部クラスにはできません!!!
重要なことを3回話して、簡単にテストしてみましょう.
まず簡単なjavaクラスを書きます
注意:javaクラスにget、setメソッドは必要ありません
public class Person {
String name;
int age;
}
SituJsonObject situJsonObject = null;
try {
situJsonObject = new SituJsonObject("{name:'jack',age:12}");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("json ");
}
Person p;
try {
p = (Person) situJsonObject.getBean(Person.class);
System.out.println("person "+p.name+p.age);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(" ");
}
json文字列のフォーマットが間違っていなければ、許容すれば成功するはずです.intタイプのjson文字列に二重引用符をつけないでください.この原生類はまだ自動的にparseIntを行うことができません.
原生にはもう一つのjsonArrayがあり、その中でよく使われる機能はget(下付き)で、この配列が下付きの値(object)に対応することを取り出すために使われています.
対応するjavaクラスを取得するための2つの方法も追加しました
package com.example.http_test;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class SituJsonArray extends JSONArray {
public SituJsonArray(String Jsons) throws JSONException
{
super(Jsons);
}
/**
* JSONObject
* @param index
* @return
* @throws Exception
*/
public JSONObject getJsonObject(int index) throws Exception
{
return new SituJsonObject(get(index).toString());
}
/**
* java ,
* @param index
* @param cls
* @return
* @throws JSONException
* @throws Exception
*/
public Object getObject(int index, Class cls) throws JSONException, Exception
{
return new SituJsonObject(get(index).toString()).getBean(cls);
}
}
これがあれば、ちょっと遍歴するだけでjson配列の各クラスを1つずつ取り出すことができますが、この配列には1つのタイプのオブジェクトしか保存できないことが条件で、次のテストをします.
//json
SituJsonArray situJsonArray = null;
try {
situJsonArray = new SituJsonArray("[{name='one',age=20},{name='two',age=30}]");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("json ");
}
try {
// jsonObject
System.out.println(situJsonArray.getJsonObject(0));
System.out.println(situJsonArray.getJsonObject(1));
// java
System.out.println(situJsonArray.getObject(0,Person.class));
System.out.println(situJsonArray.getObject(1,Person.class));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(" ");
}
ではどのようにJsonObjectで1つのjson文字列を生成して、答えは1つの属性の1つの属性の上へputだけで、jsonObjectも普通のクラスがjsonの方法を回転することを提供していません
次のようになります.
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("name", "jack");
jsonObject.put("age", 12);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(jsonObject.toString());
}
出力結果:{"age":12,"name":"jack"}
では、先ほどの考え方に従って、私たちがカスタマイズしたSituJsonObjectに方法を加えて、反射でクラスのすべてのメンバーを書きます.このクラスをwriteBeanと呼んでもいいです.
注意:この方法はjavaクラスにget、setメソッドがある必要はありません.
public void writeBean(Object obj) throws IllegalAccessException, IllegalArgumentException, JSONException{
Class cls = obj.getClass();
Field[] fs = cls.getDeclaredFields();
// , json ,
for (int i = 0; i < fs.length; i++) {
String name = fs[i].getName();
fs[i].setAccessible(true);//
Object value = fs[i].get(obj);//
this.put(name, value);
}
}
簡単な書き込みテストを行います.
SituJsonObject situJsonObject = new SituJsonObject();
try {
situJsonObject.writeBean(new Person("lixiao", 14));// JsonOBject , put
System.out.println(situJsonObject.toString());
} catch (IllegalAccessException | IllegalArgumentException
| JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(" ");
}
テスト結果:{"age":14,"name":"lixiao"}
json文字列配列を生成するには、単一オブジェクトのjson文字列を単純に加算すれば良いので、JSOnArrayクラスを使用する必要はありません
jsonObjectにもう一つの方法を追加してgetArrayStringと呼びましょう.list