优米格
分享有营养的

使用Google Gson JsonReader解析Json数据

BraUndress.png

Google Gson提供的JsonReader类可以帮助我们解析json数据。

示例数据:

[
   {
     "id": 912345678901,
     "text": "How do I read a JSON stream in Java?",
     "geo": null,
     "user": {
       "name": "json_newb",
       "followers_count": 41
      }
   },
   {
     "id": 912345678902,
     "text": "@json_newb just use JsonReader!",
     "geo": [50.454722, -104.606667],
     "user": {
       "name": "jesse",
       "followers_count": 2
     }
   }
 ]

假设我们需要解析上面所示的一组消息数据。

对于解析工作,我们一般需要取递归解析Json文本中的对象类型和数组类型的数据。

  • 对于处理数组类型,首先我们首先需要调用beginArray() 方法来读取数字的开始括号,我们一般需要逐个遍历素组的各个元素,直到hasNext()方法返回false,最后调用endArray()读取数字的结束括号。
  • 在对象处理方法中,首先调用beginObject()来使用对象的左括号。 然后创建一个while循环,根据其名称为本地变量赋值。 当hasNext())为false时,通过调用endObject()来读取对象的右括号。

对于上面的Json示例文本,我们可以像这样进行抽象:这个消息数组有多个消息组成,一个Message又分别由属性id,text,geo,user组成,其中id是long类型,text是字符串,geo是double型集合,user是User类型。

首先我们创建两个实体类Message和User,代码在文章后面的源码链接中提供。

然后我们用下面的代码来实现对上述Json文本的解析操作。

package michael.jsonreaderexaple;

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import michael.jsonreaderexaple.pojo.Message;
import michael.jsonreaderexaple.pojo.User;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 四个空格:https://www.yomige.org/
 * See more on Google Official site:https://google.github.io/gson/apidocs/com/google/gson/stream/JsonReader.html
 */
public class JsonReaderExample {
    public static void main(String[] args) {

        String jsonData = "[\n" + "   {\n" + "     \"id\": 912345678901,\n" + "     \"text\": \"How do I read a JSON stream in Java?\",\n" + "     \"geo\": null,\n" + "     \"user\": {\n" + "       \"name\": \"json_newb\",\n" + "       \"followers_count\": 41\n" + "      }\n" + "   },\n" + "   {\n" + "     \"id\": 912345678902,\n" + "     \"text\": \"@json_newb just use JsonReader!\",\n" + "     \"geo\": [50.454722, -104.606667],\n" + "     \"user\": {\n" + "       \"name\": \"jesse\",\n" + "       \"followers_count\": 2\n" + "     }\n" + "   }\n" + " ]";
        InputStream stream = new ByteArrayInputStream(jsonData.getBytes(StandardCharsets.UTF_8));
        try {
            List<Message> list = new JsonReaderExample().readJsonStream(stream);
            System.out.println(list.size());
            System.out.println(list.get(0).getId());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    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);
    }

}
赞(0)
未经允许禁止转载:优米格 » 使用Google Gson JsonReader解析Json数据

评论 抢沙发

合作&反馈&投稿

商务合作、问题反馈、投稿,欢迎联系

广告合作侵权联系