zoukankan      html  css  js  c++  java
  • Android网络请求与数据解析,使用Gson和GsonFormat解析复杂Json数据

    版权声明:未经博主允许不得转载

    封面图

    一:简介

    【达叔有道】软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family !

    二:前言

    在开发中我们要面对很复杂的操作,那么今天的网络请求与数据解析也是对于学习Android开发者来说,需要解决的难题,我只是讲解一下知识内容,用于理解这方面的知识点。

    三:HttpUrlConnection和JSON数据解析

    网络请求有两种类型,一个是get,另一个是post。网络请求通常使用HttpUrlConnction,HttpClient,还有更多的框架使用,这些框架也是其他人自己开发出来便于使用的。

    对于json解析,官方的原生解析和Gson解析,JSON是一种轻量级的数据交换格式,有很好的可读性和快速编写的特点。建议你可以下载一个Google插件,JSON Viewer可以便于看起来舒服点。

    看看JSON数据api: https://www.sojson.com/open/api/weather/json.shtml?city=上海

    在你的Android Studio中也提供一个插件名为:GsonFormat,GsonFormat可以帮你格式化Json数据,并自动生成相应的属性类。这个插件是不是很好,那就下载吧,如果项目巨大,你的Json数据多到你也不想打代码了吧!

    下载完Android Studio中的插件时(过程可以百度)重新启动一下就行。我们来验证是否安装成功,找个java文件按alt+S,弹出GsonFormat的窗口则代表安装成功。

    在GsonFormat中,放入https://www.sojson.com/open/api/weather/json.shtml?city=%E4%B8%8A%E6%B5%B7(复制全部放入),点击Format即可。

    有了GsonFormat的功能,我们就不用辛苦生成Json数据里的属性类。

    四:使用json解析

    JSON数据一般由服务器端提供接口,我们根据接口地址解析数据,然后把数据显示在APP上。

    举例:接口地址

    多个数据
    {
    'students':[
    {'id':'1',
    'name':'peipei',
    'sex':'男'},
    {'id':'2',
    'name':'kebin',
    'sex':'男'},
    {'id':'3',
    'name':'hong',
    'sex':'女'},
    ]
    }
    
    private void parseJson(String strResult){
     try{
      JSONArray obj = new JSONObject(strResult).getJSONArray("students");
      String s="";
      for(int i=0;i<obj.length();i++){
        JSONObject json = (JSONObject)obj.get(i);
        int id = json.getInt("id");
        String name=json.getString("name");
        String sex=json.getString("sex");
       s+="Id号:"+id+",名字:"+name+",性别:"+sex+"
    ";
      }
       
    }catch(JSONException e){
     e.printStackTrace();
    }
    

    如果这样写我的天,也是挺累,对于使用Gson来说就很方便啦。待会我来讲使用方法。

    对于Android来说重要的网络部分,如何解决从网络上下载数据,如何解决上传,等。我们开发app会不断向服务器发送请求,那么返回到APP的是json数据的字符串,我们需要对json数据进行解析才能显示到app客户端上。对于HTTP协议是这样的,http为超文本传送协议,是web的基础,http是建立在tcp上的一种。http在客户端发送请求都要服务器回送响应,请求结束后,会主动释放。这个过程连接到关闭为一次连接。

    五:网络权限

    在我们使用网络请求的时候,需要的是设置权限,这一点千万别忘记了。

    <uses-permission android:name="android.permission.INTERNET"/>
    

    六:使用Gson

    Gson就是一个jar包,导入就行,源代码可以看看:https://github.com/google/gson
    我们只要在build.gradle的dependencies下
    放入代码:

    implementation 'com.google.code.gson:gson:2.2.4'
    //我的是导入的
    

    我们来使用这个接口试试:https://www.sojson.com/open/api/weather/json.shtml?city=广州
    使用Gson,解析

    public static WeatherBean getWeather(String res) {
    //创建Gson对象
    Gson gson =new Gson();
    //gson.fromJson(参数1,参数2);
    WeatherBean wetherBean = gson.fromJson(res, WeatherBean.class);
    //返回
    return wetherBean;
    }
    

    七:比较详细地说明

    //HttpUrlConnection
    //1.实例化一个URL的对象
    //2.获取HttpUrlConnection对象
    //3.设置请求连接的属性
    //4.获取响应码,判断是否连接成功
    //5.读取输入流并解析
    

    八:

    要创建一个子线程

    new Thread(){
     @Override
     public void run(){
      try{
    URL url = new URL(“api地址”);
    HttpURLConnection coon=(HttpURLConnection)url.openConnection();
    coon.setRequestMethod(“GET”);
    coon.setReadTimeout(6000);
    //获取响应码
    If(coon.getResponseCode()==200){
      InputStream in=coon.getInputStream();
      byte[] b = new byte[1024*512];
      int len=0;
      //建立缓存流,保存所读取的字节数组
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
      while((len=in.read(b))>-1){
        baos.write(b,0,len);   
      }
      String msg = baos.toString();
      Log.e(“TAG”,msg);
    
      //JSON数据的解析:1.原生解析2.gson解析
      JSONObject obj = new JSONObject(msg);//捕获异常
      
      int dui = obj.getInt("dui");
      String msg2 = obj.getString("msg");
    
      Log.e("TAG,"+dui+" "+msg2);
      
      JSONObject data = obj.getJSONObject("data");
      String title = data.getString("title");
      String author = data.getString("author");
      String content = data.getString("content");
      Log.e("TAG","标题:"+title+",作者"+author+",内容:"+content);
    
       //显示 解决问题-将操作权交还给主线程
    
       Message message = handler.obtainMessage();
       Weather e = new Weather (title,author,content);
       message.obj = e;
    
       //调用此方法,会触发主线程中Handler对象里覆盖了的handleMessage方法
    
       handler.sendMessage(message);
       //nameView.setText(title);
       //authorView.setText(author);
       //contentView.setText(content);
    
    }
      }catch(MalformedURLException e){
       e.printStackTrace();
      }catch(IOExeption e){
       e.printStackTrace();
      }catch(JSONException e){
       e.printStackTrace();
      }
     }
    }.start();
    
    //Hander hander = new Hander()
    这个用来解决主线程和子线程进行交互的问题
    
    //封装对象
    private Hander handler = new Handler(){
     @Override
     public void handleMessage(Message msg){
      super.handleMessage(msg);
       
       //获取
       Weather e = (Weather)msg.obj;
       nameView.setText(e.getTitle());
       authorView.setText(e.getAuthor());
       contentView.setText(e.getContent());
     
     }
    };
    
    //使用Gson解析上一步
    //1.创建Gson对象
    Gson gson = new Gson();
    //参数1:满足json对象格式的字符串
    String data=obj.getString("data");
    Weather e = gson.fromJson(data,Weather.class);
    
    //JSONObject jo= new JSONObject(result);
    //JSONArray ary = jo.getJSONArray("data");
          
    //for(int i=0;i<ary.length();i++){
         //JSONObject obj = ary.getJSONObject(i):
         //String a = obj.getString("name");
    //}
    
    private void parseJson(String strResult){
     try{
      JSONArray obj = new JSONObject(strResult).getJSONArray("students");
      String s="";
      for(int i=0;i<obj.length();i++){
        JSONObject json = (JSONObject)obj.get(i);
        int id = json.getInt("id");
        String name=json.getString("name");
        String sex=json.getString("sex");
       s+="Id号:"+id+",名字:"+name+",性别:"+sex+"
    ";
      }
       
    }catch(JSONException e){
     e.printStackTrace();
    }
    //比较
    
    String data=new JSONObject(result).getString("data");
    //使用Gson
    Gson gson = new Gson();
    //使用Gson,快速解析,添加jar包
    //1.解析普通的json对象
    //2.解析json数组
    //参数1:满足json数组形式的字符串
    //参数2:Type对象,泛型将会决定,你的json字符串最后被转化成的类型
    ArrayList<对象> objects = gson.fromJson(data,new TypeToken<ArrayList<对象>>(){}.getType());
    

    以上就是个人记录知识点

    编辑 :达叔

    定位:分享 Android&Java 知识点

  • 相关阅读:
    css中单位的使用
    css中max-width和min-width的应用
    css-样式初始化
    html中map标签和area标签的应用
    html中常见的小问题(1)
    防止图片被盗用
    关于thinkphp的__construct和_initialize
    禁用cookie后如何使用session还有session_id的使用
    is_null(self::$_instance) && self::$_instance = new self();
    echo、print、print_r、printf、sprintf、var_dump的区别
  • 原文地址:https://www.cnblogs.com/dashucoding/p/9264910.html
Copyright © 2011-2022 走看看