Android之解析JSON格式数据

解析JSON格式数据

比起XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如XML直观。

在开始之前,我们需要在Apache\htdocs目录中新建一个get_data.json的文件,然后编辑这个文件,并加入如下JSON格式的内容:

[{“id”:“5”,“version”:“5.5”,“name”:“Clash of Clans”},
{“id”:“6”,“version”:“7.0”,“name”:“Boom Beach”},
“id”:“7”,“version”:“3.5”,“name”:“Clash Royale”]

访问http://127.0.0.1/get_data.json这个网址,就应该出现如图9.8所示的内容。
这里写图片描述
下面开始在Android中解析这些数据

使用JSONObject

 private void sendRequestWithOkHttp() {
    
    
        new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                try {
    
    
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder()
                        //指定访问的服务器地址是电脑本机
                        .url("http://10.0.2.2/get_data.json")
                        .build();

                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    parseJSONWithJSNOObject(responseData);
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
          }
        }).start();
    }
private void parseJSONWithJSNOObject(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("MainActivity","id is"+id);
	                Log.d("MainActivity","name is"+name);
	                Log.d("MainActivity","version is"+version);
	            }
	        } catch (JSONException 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());

基本的语法就是这样,首先新增一个App类,并加入id、name、和version这三个字段,如下所示:

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

 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());
	        }
	    }

猜你喜欢

转载自blog.csdn.net/i_nclude/article/details/77985038