ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android >> 37. 使用网络(二)

2019-08-01 10:02:09  阅读:208  来源: 互联网

标签:String void 37 网络 public new Android id name


解析JSON 格式数据

先准备一个文件:

新建一个get_data.json 文件,编辑,输入:

[{"id":"5","version":"5.5","name":"Clash of Clans"},
{"id":"6","version":"8.0","name":"Boom of Beach"},
{"id":"7","version":"10.0","name":"Waao"}]

PC 端可以通过http://127.0.0.1/get_data.json 进行访问:
在这里插入图片描述

使用JSONObject

private void parseJSONWithJSONObject(String jsonData){
    try{
        JSONArray jsonArray = new JSONArray(jsonData);
        for (int i=0; i<jsonArray.length(); i++){
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            String id = jsonObject.getString("id");
            String name = jsonObject.getString("name");
            String version = jsonObject.getString("version");
            Log.d("Hello", "parseJSONWithJSONObject: id is " + id);
            Log.d("Hello", "parseJSONWithJSONObject: name is " + name);
            Log.d("Hello", "parseJSONWithJSONObject: version is " + version);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

将需要处理的信息传入JSONArray() 方法,得到一个JSONArray 对象。然后遍历这个JSONArray 对象,从中取出的每一个元素都是一个JSONObject 对象。每个JSONObject 对象又会包含idnameversion 这些数据。接下来只需要调用getString() 方法将这些数据取出即可。

onCreate() 中调用:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ok_http);

    /* 用于访问网络,发送Get 请求的线程 */
    new Thread(new Runnable() {
        @Override
        public void run() {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("http://10.77.82.172/get_data.json")
                    .build();
            try {
                response = client.newCall(request).execute();
                responseData = response.body().string();
                parseJSONWithJSONObject(responseData);
            } catch (IOException e) {
                e.printStackTrace();
            }
            /* 用于更新UI 的线程 */
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(responseData);
                }
            });
        }
    }).start();
    textView = findViewById(R.id.OkHttp_tv);
}

在这里插入图片描述

使用GSON

参考 https://github.com/google/gson


GSON 是谷歌的开源项目,我们当然首先就要添加依赖了:

implementation 'com.google.code.gson:gson:2.8.5'

JSON 数据解析,只需要调用fromJson() 方法即可:
(解析成一个Person 对象)

Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);

若需要解析一段JSON 数组则麻烦一点,需要借助TypeToken 将期望解析成的数据类型传入到fromJson() 方法中:

List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>() {}.getType());

演示:

public class App{
    private String id;
    private String name;
    private String version;

    public String getId(){
        return id;
    }
    public String getName(){
        return name;
    }
    public String getVersion(){
        return version;
    }
    public void setId(String id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setVersion(String version) {
        this.version = version;
    }
}

private void parseJSONWithGSON(String jsonData){
    Gson gson = new Gson();
    List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>(){}.getType());
    for (App app:appList){
        Log.d("Hello", "parseJSONWithGSON: id is " + app.getId());
        Log.d("Hello", "parseJSONWithGSON: name is " + app.getName());
        Log.d("Hello", "parseJSONWithGSON: version is " + app.getVersion());
    }
}

最后调用:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ok_http);

    /* 用于访问网络,发送Get 请求的线程 */
    new Thread(new Runnable() {
        @Override
        public void run() {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("http://10.77.82.172/get_data.json")
                    .build();
            try {
                response = client.newCall(request).execute();
                responseData = response.body().string();
                parseJSONWithGSON(responseData);
            } catch (IOException e) {
                e.printStackTrace();
            }
            /* 用于更新UI 的线程 */
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText(responseData);
                }
            });
        }
    }).start();
    textView = findViewById(R.id.OkHttp_tv);
}

结果和之前一致。

标签:String,void,37,网络,public,new,Android,id,name
来源: https://blog.csdn.net/weixin_40973138/article/details/98027642

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有