Android JsonReader认知
2019-10-18 本文已影响0人
锄禾豆
认知点
json数据格式,现在被大众使用广泛。Android本身也封装了一个JsonReader.java
具体的包为android.util.JsonReader
Android标准案例
jsonarray格式:
{
[
{
"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
}
}
]}
代码分析:
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);
}
分析JsonReader类
public方法如下:
public.png特别留意的方法:
1)peek()
仔细分析nextBoolean、nextName等方法,都会涉及到peek,peek也就是先检测next下面是什么值,这样就可以精细化了解数据源,避免简单粗暴的进行catch操作
2)setLenient(boolean)
一般的json都是按照标准的格式输出,不然,会异常。有了setLenient就可以忽视某些不正常的情况,其实这样更加人性一点。例如:
<li>End of line comments starting with {@code //} or {@code #} and
ending with a newline character.
<li>C-style comments starting with {@code /*} and ending with
{@code *}{@code /}. Such comments may not be nested.
<li>Names that are unquoted or {@code 'single quoted'}.
<li>Strings that are unquoted or {@code 'single quoted'}.
<li>Array elements separated by {@code ;} instead of {@code ,}.
<li>Unnecessary array separators. These are interpreted as if null
was the omitted value.
<li>Names and values separated by {@code =} or {@code =>} instead of
{@code :}.
<li>Name/value pairs separated by {@code ;} instead of {@code ,}.