Android手動によるJsonの作成と解析
28904 ワード
概要
現在Android開発で作成・解析Jsonの多くはGsonやfastJsonなどのマッピング可能なオブジェクトのサードパーティライブラリを利用しており、確かに非常に便利で、Gson解析を使うには私の別の文章を参考にGson解析やjsonを作成することができますが、手動で解析する必要がある場合があります.本稿では,サードパーティ製ライブラリを使用することなく,Androidが持つJsonObjectなどのクラスを直接使用してjsonを作成し解析し,小さなDemoを用意した.
1 jsonのフォーマット紹介
1.1 jsonオブジェクト
{"name": "jadyli", "gender": "male"}
オブジェクトはキー値のペアとして表され、データはカンマで区切られ、カッコでオブジェクトを保存し、キー名を二重引用符で包み、コロンでキーと値を区切る.値がStringタイプで、二重引用符またはコロンが含まれている場合は、「」を使用します.
1.2 json配列
[
{"name": "jadyli", "gender": "male"},
{"name": "sanqi", "gender": "male"}
]
かっこは配列を保存します.
2 Androidが持参したJson操作類
2.1 JSONObject
2.1.1 JSOnObject基本紹介
Android公式の紹介は
A modifiable set of name/value mappings. Names are unique, non-null strings. Values may be any mix of JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL. Values may not be null, NaNs, infinities, or of any type not listed here.
変更可能なキー値ペアのマッピングセット.キーは一意で、空ではない文字列です.値は、JSONObjects、JSOnArrays、Strings、Booleans、Integers、Longs、DoubleまたはNULLの任意の組み合わせです.値はnull,NaNs,infinitiesではないか,あるいは任意のここで列挙されていないタイプである可能性もある.
いくつかの一般的な方法は、Android JSOnObjectクラスを参照してください.
メソッド名(パラメータ)
説明
get(String name)
キーマッピングの値を返し、見つからない場合は例外を放出します.
getInt(String name)
int値を返し、見つからない場合は例外を放出
getString(String name)
String値を返し、見つからない場合は例外を放出します.
opt(String name)
キーマッピングの値を返し、見つからない場合nullを返します.
optString(String name, String fallback)
キーマッピングの値を返し、見つからない場合はメソッドパラメータのfallbackを返します.
optString(String name)
キーマップの値を返し、見つからない場合は空の文字列を返します.
put(String name, Object value)
キーを値にマップします.このオブジェクトにこのキーが存在する場合、前のキーが上書きされます.
put(String name, int value)
キーを値にマップします.このオブジェクトにこのキーが存在する場合、前のキーが上書きされます.
getJSONObject(String name)
JSOnObjectに戻り、見つからない場合は例外を投げ出す
getJSONArray(String name)
JSOnArray値を返し、見つからない場合は例外を放出
keys()
Iteratorを返します.このオブジェクトのキーの集合反復器です.
names()
JSOnArrayを返します.このオブジェクトのキーの配列です.
length()
このオブジェクトのデータバーの数を返します
has(String name)
このオブジェクトにこのキーのマッピングがあるかどうかを判断する
isNull(String name)
このオブジェクトにこのキーのマッピングがあるかどうか、またはNULLの判定値
toString()
このオブジェクトをjson列に変換します.たとえば、{"query":"Pizza","locations":[9404390210]}
toString(int indentSpaces)
このオブジェクトをjson列に変換すると、改行やインデントが表示され、読みやすくなります
JSOnObject()コンストラクションメソッドを呼び出し、空のJSOnObjectを作成するか、JSOnObject(String json)を呼び出してjson文字列を入力します.
2.1.2 JSOnObjectの例
上記の方法を用いると,一般的なjson文字列を解析して作成することができる.このjson文字列を例にとります.
{"name": "jadyli", "gender": "male", "age": 18}
jsonの作成
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "jadyli");
jsonObject.put("gender", "male");
jsonObject.put("age", 18);
System.out.println(jsonObject.toString(1));
しゅつりょく
{“name”:”jadyli”,”gender”:”male”,”age”:18}
解析json
String json = "{\"name\": \"jadyli\", \"gender\": \"male\", \"age\": 18}";
JSONObject jsonObject = new JSONObject(json);
System.out.println(" :" + jsonObject.getString("name"));
System.out.println(" :" + jsonObject.getString("gender"));
System.out.println(" :" + jsonObject.getString("age"));
2.2 JSONArray
JSOnArray JSOnArrayの仕様はJSOnObjectとほぼ一致しています.JSOnObjectとJSOnArrayを併用した小例をあげます.
{
"students": [
{
"name": "jadyli",
"gender": "male",
"age": 18
},
{
"name": "Juliet",
"gender": "female",
"age": 20
}
]
}
jsonの作成
String[] names = {"jadyli", "Juliet"};
String[] genders = {"male", "female"};
int[] ages = {18, 20};
JSONArray students = new JSONArray();
for (int i = 0; i < names.length; i++) {
JSONObject student = new JSONObject();
student.put("name", names[i]);
student.put("gender", genders[i]);
student.put("age", ages[i]);
students.put(student);
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("students", students);
System.out.println(jsonObject.toString(1));
しゅつりょく
{“students”:[{“name”:”jadyli”,”gender”:”male”,”age”:18},{“name”:”Juliet”,”gender”:”female”,”age”:20}]}
解析json
String json = "{"students":[{"name":"jadyli","gender":"male","age":18},
{"name":"Juliet","gender":"female","age":20}]}";
JSONObject jsonObject = new JSONObject(json);
JSONArray students = jsonObject.getJSONArray("students");
for (int i = 0; i < students.length(); i++) {
JSONObject student = students.getJSONObject(i);
System.out.println(" :" + student.getString("name"));
System.out.println(" :" + student.getString("gender"));
System.out.println(" :" + student.getInt("age") + "
");
}
2.3 JSONStringer
メソッドはJSOnStringerを参照して、主にこのクラスを使用してjsonを作成します.
{
"students": [
{
"name": "jadyli",
"gender": "male",
"age": 18
},
{
"name": "Juliet",
"gender": "female",
"age": 20
}
]
}
JSONStringer jsonStringer = new JSONStringer();
jsonStringer.object();
jsonStringer.key("students");
jsonStringer.array();
String[] names = {"jadyli", "Juliet"};
String[] genders = {"male", "female"};
int[] ages = {18, 20};
for (int i = 0; i < names.length; i++) {
jsonStringer.object();
jsonStringer.key("name");
jsonStringer.value(names[i]);
jsonStringer.key("gender");
jsonStringer.value(genders[i]);
jsonStringer.key("age");
jsonStringer.value(ages[i]);
jsonStringer.endObject();
}
jsonStringer.endArray();
jsonStringer.endObject();
System.out.println(jsonStringer.toString());
しゅつりょく
{“students”:[{“name”:”jadyli”,”gender”:”male”,”age”:18},{“name”:”Juliet”,”gender”:”female”,”age”:20}]}
2.4 JSONTokener
方法参考JSONTokener
このクラスは主にjsonを解析するために用いられる.JSONTokenerを使用して、次のjsonを解析します.
{
"students": [
{
"name": "jadyli",
"gender": "male",
"age": 18
},
{
"name": "Juliet",
"gender": "female",
"age": 20
}
]
}
JSONTokener jsonTokener = new JSONTokener("{\"students\":[" +
"{\"name\":\"jadyli\",\"gender\":\"male\",\"age\":18}," +
"{\"name\":\"Juliet\",\"gender\":\"female\",\"age\":20}]}");
JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
JSONArray students = jsonObject.getJSONArray("students");
for (int i = 0; i < students.length(); i++) {
JSONObject student = students.getJSONObject(i);
System.out.println(" :" + student.getString("name"));
System.out.println(" :" + student.getString("gender"));
System.out.println(" :" + student.getInt("age") + "
");
}
ただnextValue()を使ってjsonをJSOnObjectと読みました.JSONTokenerの主な役割は、jsonの文字を読み取ることであり、一般的には使用されません.
System.out.println(jsonTokener.next()); //
jsonTokener.skipPast("name"); // name
System.out.println(jsonTokener.next(2));//
JsonReader
ここでの
JsonReader
とは、android.util
で包まれたものであり、gson
ではない.公式のdemoを直接参考にすることができます.このような
json
入力ストリームがあると仮定する.[
{
"id": 912345678901,
"text": "How do I read JSON on Android?",
"geo": null,
"user": {
"name": "android_newb",
"followers_count": 41
}
},
{
"id": 912345678902,
"text": "@android_newb just use android.util.JsonReader!",
"geo": [
50.454722,
-104.606667
],
"user": {
"name": "jesse",
"followers_count": 2
}
}
]
JsonReader
を使用して、上記json
を解析します.public List readJsonStream(InputStream in) throws IOException {
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
try {
return readMessagesArray(reader);
}
finally {
reader.close();
}
}
public List readMessagesArray(JsonReader reader) throws IOException {
List messages = new ArrayList();
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);
}
上記の方法の詳細については、JsonReaderを参照してください.
JsonWriter
ここでの
JsonWriter
とは、android.util
で包まれたものであり、gson
ではない.公式のdemoを直接参考にすることができます.このような
json
入力ストリームがあると仮定する.[
{
"id": 912345678901,
"text": "How do I write JSON on Android?",
"geo": null,
"user": {
"name": "android_newb",
"followers_count": 41
}
},
{
"id": 912345678902,
"text": "@android_newb just use android.util.JsonWriter!",
"geo": [
50.454722,
-104.606667
],
"user": {
"name": "jesse",
"followers_count": 2
}
}
]
JsonWriter
を使用して、上記json
を記述します.public void writeJsonStream(OutputStream out, List messages) throws IOException {
JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
writer.setIndent(" ");
writeMessagesArray(writer, messages);
writer.close();
}
public void writeMessagesArray(JsonWriter writer, List messages) throws IOException {
writer.beginArray();
for (Message message : messages) {
writeMessage(writer, message);
}
writer.endArray();
}
public void writeMessage(JsonWriter writer, Message message) throws IOException {
writer.beginObject();
writer.name("id").value(message.getId());
writer.name("text").value(message.getText());
if (message.getGeo() != null) {
writer.name("geo");
writeDoublesArray(writer, message.getGeo());
} else {
writer.name("geo").nullValue();
}
writer.name("user");
writeUser(writer, message.getUser());
writer.endObject();
}
public void writeUser(JsonWriter writer, User user) throws IOException {
writer.beginObject();
writer.name("name").value(user.getName());
writer.name("followers_count").value(user.getFollowersCount());
writer.endObject();
}
public void writeDoublesArray(JsonWriter writer, List<double> doubles) throws IOException {
writer.beginArray();
for (double value : doubles) {
writer.value(value);
}
writer.endArray();
}
上記の方法の詳細についてはJsonWriterを参照してください.
本明細書のdemoアドレス