第一行代码 第九章 网络技术 - 解析JSON格式数据

比起XML格式数据,解析JSON格式数据会更省流量。
解析的方式也有很多种方法,可以使用官方提供的JSONObject,也可以使用谷歌的开源库GSON。

一、JSONObject
实例:
MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    TextView tvShowHttpResponse;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvShowHttpResponse = (TextView)findViewById(R.id.tvShowHttpResponse);
        Button btnSendHttpRequest = (Button)findViewById(R.id.btnSendHttpRequest);
        btnSendHttpRequest.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if(view.getId() == R.id.btnSendHttpRequest){
            sendHttpRequset();
        }
    }
    private void sendHttpRequset() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client = new OkHttpClient.Builder()
                            .writeTimeout(60, TimeUnit.SECONDS)
                            .readTimeout(60, TimeUnit.SECONDS)
                            .connectTimeout(100, TimeUnit.SECONDS)
                            .build();
//                    OkHttpClient client = new OkHttpClient();
                    Request requset = new Request.Builder()
                            // 指定服务器的地址 - 10.0.2.2对于模拟器来说就是电脑本机的IP地址
                            .url("http://10.0.2.2/get_data.json")
                            .build();
                    Response response = client.newCall(requset).execute();
                    String responseData = response.body().string();
                    parseJSONWithJSONObject(responseData);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    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 version = jsonObject.getString("version");
                String name = jsonObject.getString("name");

                Log.d(TAG, "id is:" + id);
                Log.d(TAG, "version is:" + version);
                Log.d(TAG, "name is:" + name);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

定义一个JSONArray数组,并将服务器返回的数据传入;然后遍历这个数组,从中取出的每一个元素都是一个JSONObject对象,在每个JSONObject对象中又会包含字段,通过get方法就可以把数据取出。


二、GSON
既然是开源库,就需要在app/build.gradle文件中导入
compile ‘com.google.code.gson:gson:2.7’

GSON库主要是将一段JSON格式的字符串自动映射成一个对象,从而不需要我们在手动编写代码进行解析。

比如一段JSON格式的数据如下:
{“name”:”ads”, “age”:”12”}
我们就可以定义一个类,加入name和age字段,通过以下代码就可以将JSON数据自动解析成一个Person对象了。
Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);

如果解析的是JSONS数组,可以使用以下方式:
List<Person> person = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());

实例:
JSONData.java

public class JSONData {
    String id;
    String version;
    String name;

    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }

    public String getVersion() {
        return version;
    }

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

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

    public void setVersion(String version) {
        this.version = version;
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    TextView tvShowHttpResponse;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvShowHttpResponse = (TextView)findViewById(R.id.tvShowHttpResponse);
        Button btnSendHttpRequest = (Button)findViewById(R.id.btnSendHttpRequest);
        btnSendHttpRequest.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if(view.getId() == R.id.btnSendHttpRequest){
            sendHttpRequset();
        }
    }
    private void sendHttpRequset() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client = new OkHttpClient.Builder()
                            .writeTimeout(60, TimeUnit.SECONDS)
                            .readTimeout(60, TimeUnit.SECONDS)
                            .connectTimeout(100, TimeUnit.SECONDS)
                            .build();
//                    OkHttpClient client = new OkHttpClient();
                    Request requset = new Request.Builder()
                            // 指定服务器的地址 - 10.0.2.2对于模拟器来说就是电脑本机的IP地址
                            .url("http://10.0.2.2/get_data.json")
                            .build();
                    Response response = client.newCall(requset).execute();
                    String responseData = response.body().string();
                    parseJSONWithGSON(responseData);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void parseJSONWithGSON(String jsonData) {
        Gson gson = new Gson();
        List<JSONData> jsonDataList = gson.fromJson(jsonData, new TypeToken<List<JSONData>>(){}.getType());
        for(JSONData data : jsonDataList){
            Log.d(TAG, "id is:"+data.getId());
            Log.d(TAG, "id is:"+data.getName());
            Log.d(TAG, "id is:"+data.getVersion());
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值