Java 解析JSON 2 利用GJson解析常见的JSON数据

前面我已经给大家讲了利用GJson 解析一个简单的JSON,接下来演示一个较常见的Json文件(gjon 官方给的示例)
1.Json 文件

[
  {
    "id": 10011,
    "text": "How I read a Json Stream in Java",
    "geo": null,
    "user": {
      "name": "json_newb",
      "followers_cout": 41
    }
  },
  {
    "id": 10022,
    "text": "JSON test",
    "geo":[11.32,-104.11],
    "user": {
      "name": "json_newb",
      "followers_cout": 41
    }
  }
]

2-1、根据Json文件可以看出Json需一个主类

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

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

    public Message() {
    }

    public Message(long id, String text, ArrayList<Double> geo, User user) {
        this.id = id;
        this.text = text;
        this.geo = geo;
        this.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;
    }
}

2-2、在主类里包含一个user的类

class User{
    private String name;
    private Integer followers_cout;

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

    public User() {
    }

    public User(String name, Integer followers_cout) {
        this.name = name;
        this.followers_cout = followers_cout;
    }

    public String getName() {
        return name;
    }

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

    public Integer getFollowers_cout() {
        return followers_cout;
    }

    public void setFollowers_cout(Integer followers_cout) {
        this.followers_cout = followers_cout;
    }
}

3.配置Maven

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.2.4</version>
</dependency>

4.编写实现代码

import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;

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

public class Mtest {
    public static void main(String[] args) throws IOException {
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("messages.json");//加载
        InputStreamReader in=new InputStreamReader(is);//转换为reader
        JsonReader jsonReader= new JsonReader(in);//装载

        ArrayList<Message> list = readmessageArray(jsonReader);//交给Message 数组处理方法处理,并返回一个List对象
        //-----------验证
        list.forEach((m)->{
            System.out.println(m.toString());
        });

    }
    //1.读取Meagess 数组
    private static ArrayList<Message> readmessageArray(JsonReader jsonReader) throws IOException {
        ArrayList<Message> list=new ArrayList<>();
        jsonReader.beginArray();
        while (jsonReader.hasNext()){
            list.add(readMessage(jsonReader));
        }
        jsonReader.endArray();

        return list;
    }
    //2.解析Message 对象
    private static Message readMessage(JsonReader jsonReader) throws IOException {
        Message ms= new Message();
        jsonReader.beginObject();
        while (jsonReader.hasNext()){
          String name = jsonReader.nextName();
          if ("id".equals(name)){
              ms.setId(jsonReader.nextLong());
          }else if ("text".equals(name)){
              ms.setText(jsonReader.nextString());
          }else if ("geo".equals(name) && jsonReader.peek()!= JsonToken.NULL){
                ms.setGeo(readgeo(jsonReader));
          }else if ("user".equals(name)){
                ms.setUser(readuser(jsonReader));
          }else {
              jsonReader.skipValue();//注意这里一定要加,否则遇到Null会报错
          }
        };
        jsonReader.endObject();
        return  ms;
    }
    //3.读取GEO数组
    private static ArrayList<Double> readgeo(JsonReader jsonReader) throws IOException {
        ArrayList<Double> list=new ArrayList<>();
        jsonReader.beginArray();
        while (jsonReader.hasNext()){
            list.add(jsonReader.nextDouble());
        }
        jsonReader.endArray();
        return list;
    }
    //4.读取user对象
    private static User readuser(JsonReader jsonReader) throws IOException {
        User user=new User();
        jsonReader.beginObject();
        while (jsonReader.hasNext()){
            String tag=jsonReader.nextName();
            if("name".equals(tag)){
                user.setName(jsonReader.nextString());
            }else if ("followers_cout".equals(tag)){
                user.setFollowers_cout(jsonReader.nextInt());
            }else {
                jsonReader.skipValue();//注意这里一定要加,否则遇到Null会报错
            }
        }
        jsonReader.endObject();
        return user;
    }

}

效果

Message{id=10011, text='How I read a Json Stream in Java', geo=null, user=User{name='json_newb', followers_cout=41}}
Message{id=10022, text='JSON test', geo=[11.32, -104.11], user=User{name='json_newb', followers_cout=41}}

总结:遇到JSON结构中[]用数组,遇到{}就是对象
那么请分析如下Json文件并实现解析

{"WarehouseID":"9999999","WarehouseAddress":"深圳市福田区福田保税区","CallBack":"0000012","MemberID":"123456","ShipperCode":"ZTO","LogisticCode":"1234561","OrderCode":"1234561","MonthCode":"","PayType":"1","ExpType":"1","Cost":12,"OtherCost":0,"Receiver":{"Company":"腾讯科技","Name":"张三","Tel":"0755-0907283","Mobile":"13709076789","PostCode":"435100","ProvinceName":"广东省","CityName":"深圳市","ExpAreaName":"福田区","Address":"深南大道2009号"},"Sender":{"Company":"快金数据","Name":"李四","Tel":"0755-1111111","Mobile":"13932080778","PostCode":"435100","ProvinceName":"广东省","CityName":"深圳市","ExpAreaName":"福田区","Address":"福田保税区"},"StartDate":"","EndDate":"","Weight":3,"Quantity":1,"Volume":2,"Remark":"","AddService":[{"Name":"","Value":"","CustomerID":""},{"Name":"","Value":"","CustomerID":""},{"Name":"","Value":""}],"Commodity":[{"GoodsName":"书本","GoodsCode":"20398","Goodsquantity":1,"GoodsPrice":100,"GoodsWeight":2,"GoodsVol":10,"GoodsDesc":"格林童话"}]}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值