《疫情数据抓取和分析》训练营day04_json解析

json解析

一、必备知识

1、OOP面向对象

2、List集合

3、gson

二、什么是json

JSON(JavaScript Object Notation)

 

 

 

三、json格式

json格式:就是一组无序的名值对组合。

JSON基于两种结构:

1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {name:value,name:value,...}的键值对的结构,在面向对象的语言中,name为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。

 

 

2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","c",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

 

例如:

{
     "id": 912345678901,
     "text": "How do I read a JSON stream in Java?",
     "geo": null,
     "user": {
       "name": "json_newb",
       "followers_count": 41
      }
   }
​


四、json解析

JSON解析的几种解析方式:

  • JSON:原生
  • GSON:谷歌
  • FASTJSON:阿里巴巴

 

GSON解析的原理:

可以通过流来创建JsonReader对象

解析json对象:{}

  • beginObject()
  • endObject()

解析json数组:[]

  • beginArray()
  • endArray()

示例代码:

package com.coding.util;
​
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
​
import com.google.gson.stream.JsonReader;
​
/**
 * 获取网络数据并处理
 * 
 * step1:获取网络的数据:json格式
 * 
 * step2:解析json-->Java的对象
 * 
 * @author ruby
 *
 */
public class HttpDataHandle {
​
  /**
   * 根据指定的网址,获取json字符串
   * 
   * @param urlString
   * @return
   * @throws IOException
   */
  public String request(String urlString) throws IOException {
    // 1.根据网址,创建URL对象
    URL url = new URL(urlString);
    // 2.打开网络连接,获取连接对象
    URLConnection connection = url.openConnection();
    // 3.设置
    connection.setConnectTimeout(10000);
    connection.setRequestProperty("Content-Type", " application/json; charset=utf-8");
    // 4.通过IO流进行获取
    BufferedInputStream in = new BufferedInputStream(connection.getInputStream());// 提升效率
    byte[] bs = new byte[1024];
    int len = -1;
    StringBuffer sb = new StringBuffer();
    while ((len = in.read(bs)) != -1) {
      sb.append(new String(bs, 0, len));
    }
    in.close();// 关闭流
    String json = sb.toString();
    return json;
  }
​
  /**
   * 解析json,得到Data对象
   * @param json
   * @return
   * @throws IOException 
   */
  public Data parseJson(String json) throws IOException{
    //1.io包下有StringReader,字符串的字符流
    StringReader sr = new StringReader(json);
    //2.gson包下,jsonReader,类似于一个读取器
    JsonReader jsonReader = new JsonReader(sr);
    //3.开始解析
    Data data = null;
    jsonReader.beginObject(); 
    while(jsonReader.hasNext()){
      //开始解析
      String name = jsonReader.nextName();
      switch (name) {
      case "data_title":
        //跳过
        jsonReader.skipValue();
        break;
​
      case "data":
        //疫情数据
        data = praseData(jsonReader);
        break;
      default:
        break;
      }
    }
    
    
    jsonReader.endObject();
    return data;
  }
  
  //解析data
  private Data praseData(JsonReader jsonReader) throws IOException {
    jsonReader.beginObject();
    Data data = new Data();
    while(jsonReader.hasNext()){
      String name = jsonReader.nextName();
      switch (name) {
      case "times":
        data.setTimes(jsonReader.nextString());
        break;
      case "mtime":
        data.setMtime(jsonReader.nextString());
        break;
      case "cachetime":
        data.setCachetime(jsonReader.nextString());
        break;
      case "gntotal":
        data.setGntotal(jsonReader.nextString());
        break;
      case "deathtotal":
        data.setDeathtotal(jsonReader.nextString());
        break;
      case "sustotal":
        data.setSustotal(jsonReader.nextString());
        break;
      case "curetotal":
        data.setCuretotal(jsonReader.nextString());
        break;
      case "econNum":
        data.setEconNum(jsonReader.nextString());
        break;
      case "heconNum":
        data.setHeconNum(jsonReader.nextString());
        break;
      case "add_daily":
        AddDaily addDaily = parseAddDaily(jsonReader);
        data.setAdd_daily(addDaily);
        break;
      case "list":
        List<Province> list = parseProviceList(jsonReader);
        data.setProvinceList(list);
        break;
      default:
        jsonReader.skipValue();
        break;
      }
    }
    
    
    
    jsonReader.endObject();
    return data;
  }
​
  //解析省份集合
  private List<Province> parseProviceList(JsonReader jsonReader) throws IOException {
    List<Province> list = new ArrayList<Province>();
    //此处是数组
    jsonReader.beginArray();
    
    while(jsonReader.hasNext()){
      Province province = parseProvince(jsonReader);
      list.add(province);
    }
    
    
    jsonReader.endArray();
    return list;
  }
//解析省份
  private Province parseProvince(JsonReader jsonReader) throws IOException {
    Province province = new Province();
    jsonReader.beginObject();
    while(jsonReader.hasNext()){
      String name = jsonReader.nextName();
      switch (name) {
      case "name":
        province.setName(jsonReader.nextString());
        break;
      case "ename": 
        province.setEname(jsonReader.nextString());
        break;
      case "value":
        province.setValue(jsonReader.nextString());
        break;
      case "conadd":
        province.setConadd(jsonReader.nextString());
        break;
      case "econNum":
        province.setEconNum(jsonReader.nextString());
        break;
      case "susNum":
        province.setSusNum(jsonReader.nextString());
        break;
      case "deathNum":
        province.setDeathNum(jsonReader.nextString());
        break;
      case "cureNum":
        province.setCureNum(jsonReader.nextString());
        break;
      default:
        jsonReader.skipValue();
        break;
      }
    }
    
    jsonReader.endObject();
    return province;
  }
​
  //解析AddDaily
  private AddDaily parseAddDaily(JsonReader jsonReader) throws IOException {
    AddDaily addDaily = new AddDaily();
    jsonReader.beginObject();
    while(jsonReader.hasNext()){
      String name = jsonReader.nextName();
      switch (name) {
      case "addcon_new":
        addDaily.setAddcon_new(jsonReader.nextString());
        break;
      case "adddeath_new":
        addDaily.setAdddeath_new(jsonReader.nextString());
        break;
      case "addcure_new":
        addDaily.setAddcure_new(jsonReader.nextString());
        break;
      case "wjw_addsus_new":
        addDaily.setWjw_addsus_new(jsonReader.nextString());
        break;
      case "addecon_new":
        addDaily.setAddecon_new(jsonReader.nextString());
        break;
      case "addhecon_new":
        addDaily.setAddhecon_new(jsonReader.nextString());
        break;
        
        
        
      default:
        jsonReader.skipValue();
        break;
      }
    }
    
    
    
    jsonReader.endObject();
    return addDaily;
  }
​
  public static void main(String[] args) {
    String urlString = "https://interface.sina.cn/news/wap/fymap2020_data.d.json";
    HttpDataHandle httpDataHandle = new HttpDataHandle();
    try {
      String json = httpDataHandle.request(urlString);
      System.out.println(json);
      
      Data data  = httpDataHandle.parseJson(json);
//      System.out.println(data);
//      System.out.println(data.getAdd_daily());
      for(Province province:data.getProvinceList()){
        System.out.println(province);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
​
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值