Android进化

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 ,}.
上一篇 下一篇

猜你喜欢

热点阅读