Java 之XML与JSON(JSON的复杂使用)

测试用例来自官方API文档

JSON类

package com.vince.json;

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class JsonDemo2 {
    /**
     * 使用JsonReader解析负责的Json数据
     */

    @Test
 public void parseJSONMessages(){
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/vince/message.json");
        InputStreamReader in=new InputStreamReader(is);
        JsonReader jsonReader=new JsonReader(in);
        ArrayList<Message> list= readMessageArray(jsonReader);
        for (Message m:list){
            System.out.println(m);
        }

    }
//读取Message数组
   private ArrayList<Message> readMessageArray(JsonReader jsonReader) {
       ArrayList<Message> list =new ArrayList<>();
       try {
           jsonReader.beginArray();
           while (jsonReader.hasNext()){
            list.add( readMessage(jsonReader));
           }
           jsonReader.endArray();
       } catch (IOException e) {
           e.printStackTrace();
       }

       return list;
    }

    //解析一个Message对象
    private Message readMessage(JsonReader jsonReader) {
        Message m=new Message();
        try {
            jsonReader.beginObject();
            while (jsonReader.hasNext()){
                String name = jsonReader.nextName();
                if("id".equals(name)){
                    m.setId(jsonReader.nextLong());
                }else if("text".equals(name)){
                    m.setText(jsonReader.nextString());
                }else if("geo".equals(name)&&jsonReader.peek()!= JsonToken.NULL){//跳过空的设置
                 m.setGeo(readGeo(jsonReader));
                }else if("usr".equals(name)){
                    m.setUser(readUser(jsonReader));
                }else {
                    jsonReader.skipValue();//&&jsonReader.peek()!= JsonToken.NULL 不成立跳过去
                }
            }
            jsonReader.endObject();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return m;
    }

    /**
     * 解析User对象
     * @param jsonReader
     * @return
     */
    private User readUser(JsonReader jsonReader) {
        User user=new User();
        try {
            jsonReader.beginObject();
            while (jsonReader.hasNext()){
                String name=jsonReader.nextName();
                if("name".equals(name)){
                    user.setName(jsonReader.nextName());
                }else if("followers_count".equals(name)){
                    user.setFollowers_count(jsonReader.nextInt());
                }else {
                    jsonReader.skipValue();
                }
            }
            jsonReader.endObject();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return user;
    }

    /**
     * 解析GEO数组
     * @param jsonReader
     * @return
     */
    private ArrayList<Double> readGeo(JsonReader jsonReader) {
        ArrayList<Double> list=new ArrayList<>();
        try {
            jsonReader.beginArray();
            while (jsonReader.hasNext()){
               list.add(jsonReader.nextDouble());
            }
            jsonReader.endArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return  list;
    }
}

创建Message类

package com.vince.json;

import java.util.ArrayList;

public class Message {
    private long id;
    private String text;
    private ArrayList<Double> geo;
    private User user;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public ArrayList<Double> getGeo() {
        return geo;
    }

    public void setGeo(ArrayList<Double> geo) {
        this.geo = geo;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Message(long id, String text, ArrayList<Double> geo, User user) {
        this.id = id;
        this.text = text;
        this.geo = geo;
        this.user = user;
    }

    public Message() {
    }

    @Override
    public String toString() {
        return "Message{" +
                "id=" + id +
                ", text='" + text + '\'' +
                ", geo=" + geo +
                ", user=" + user +
                '}';
    }
}

创建User类

package com.vince.json;

public class User {
    private String name;
    private int followers_count;

    public User(String name, int followers_count) {
        this.name = name;
        this.followers_count = followers_count;
    }

    public User() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getFollowers_count() {
        return followers_count;
    }

    public void setFollowers_count(int followers_count) {
        this.followers_count = followers_count;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", followers_count=" + followers_count +
                '}';
    }
}

测试使用的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
     }
   }
 ]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值