【声明】 

迎接转载,但请保留文章原来出处→_→ 

生命壹号:http://www.cnblogs.com/smyhvae/

小说来源:http://www.cnblogs.com/smyhvae/p/4063452.html

 

【正文】

作品回看: Android互连网之数据解析—-SAX格局解析XML数据

一 、Json数据的介绍                     
                                                                       
                  

Json(JavaScript Object Notation)
是一种轻量级的数据沟通格式。它依据JS的八个子集。
Json选取完全部独用立于言语的文本格式,那使得Json成为可以的数据调换语言。易于人阅读和编辑,同时也简单机器解析和转移。

Json简单的话就是JS中的对象和数组,所以XML,Json也设有三种结构:对象、数组

1、Json对象:

意义:是“‘键/值’对”的九冬聚集

格式:Json对象定义在花括号“{}”内,以Key:value键值对的方式存放数据,多少个键值对里面采纳逗号“,”隔开分离,多少个数据运用分号“;”隔断。

XML 1

举例:

{
    “name”:”jackson”,
    “age”:100
}

注:差异的言语中,它被清楚为对象(object)、纪录(record)、结构(struct)、字典(dictionary)、哈希表(hash
table)、有键列表(keyed list)、大概关联数组 (associative array)。

2、Json数组:

意义:数组是值(value)的有序聚集

格式:Json数组定义在方括号“[]”内,以字符串的花样存放数据,值时期选取逗号“,”隔开分离,多少个数据运用分号“;”隔离。

XML 2

举例:

1 {
2     “students”:
3     [
4         {“name”:”jackson”,“age”:100},
5         {“name”:”michael”,”age”:51}
6     ]
7 }

一般景观下,大家用jsp+servlet作服务器端,生成Json的数量;然后在客户端解析Json的数目。

解析JSON数据, 首先供给显著待分析的是JSON Object依然JSON array,
然后必要明确采纳哪类分析技术。android平台上相似有以下二种分析技术可供接纳:android内置的org.json包(Json),google的开源库GSON,还有部分第贰方的开源库如杰克逊、法斯特Json等。我们前日来学习一下选取开源库GSON来解析Json数据。

 

二 、Gson解析Json的基本思路             
                                                                       
               

首先在劳务器端,将服务器端的Person对象通过Gson分析成json的字符串;然后在客户端,通过Gson类将json的字符串还原为Person对象。Gson支持任意复杂Java对象包涵没有源代码的目的。

要是大家将Person对象看成一个泛型,那么不论服务器端的Person对象是如何类型,都得以分析出来。

Gson库神奇在哪儿吗?假诺条分缕析的是Json对象,它根本就是足以将一段Json格式的字符串自动映射成一个指标,从而不须求大家再手动去编写代码举行分析了。比如一段Json格式的数目如下:

{"name":"tom","age":20} 

那大家就足以写一个Person类,并投入name和age那七个字段,只须求简单地调用如下代码就足以将Json数据自动分析成三个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()); 

着力用法正是这么,我们今日来看一下切实的贯彻步骤吧。

 

叁 、Gson解析Json的步调(代码完成)     
                                                                       
             

方今经过二个示范程序来讲学一下SAX是怎么解析XML文件的,那一个示例程序是运转在Android平台上的,为了模仿真实意况,在tomcat服务器上放置了二个五个静态的XML文件:person.json和perons.json,前者代表对象,后者代表对象数组。即在D:\apache-tomcat-8.0.14\webapps\ROOT目录中新建文件person.json和perons.json.

person.json的剧情如下:

{
"id": 1,
"name": "smyhvae",
"address":"成都"
} 

亟需尤其注意的是,要留意json文件的格式。例如第肆行的末端不要有逗号(笔者正是因为这一个低级错误,导致新兴调节和测试程序,调了半个多钟头才发现)

persons.json的剧情如下:

[{
    "id": 1,
    "name": "smyhvae",
    "address":"成都"
},
{
    "id": 2,
    "name": "许嵩",
    "address":"合肥"
}] 

注:关于tomcat服务器的配备,如若不亮堂的话,请参考本身别的一篇博客的第1段:JavaWeb学习(一)—-JSP简介及入门(含汤姆cat的行使)

因为本人电脑的IP地址是192.168.1.112。今后大家在浏览器输入http://192.168.1.112:8080/person.json和http://192.168.1.112:8080/persons.json,显示效果如下:

XML 3

XML 4

上面的国语现身了乱码,可是没什么,在稍后解析的时候是不会油不过生那种情状的。

先天我们供给做的是:通过Android程序去获得并分析这段Json数据。因为是Android程序,所以别忘了赋予其访问互联网的权位。

全总工程文件的目录结构如下:

XML 5

(1)下载并添加Gson的jar包:

下载地址:https://code.google.com/p/google-gson/  网页界面如下:

XML 6

点击上海教室中的红框部分,出现如下界面:

XML 7

上海体育场合中的红框部分gson-2.3.jar正是大家需求下载的内容,如若急需扶助文书档案的话,也得以把箭头处的文本下载下来。然后把gson-2.3.jar拷贝到工程文件的libs目录下,Gson库就自动添加到项目中去了。

(2)新建筑工程具类HttpUtils】通过U汉兰达LHttpConnection获取服务器上的XML流:再次回到的是字符串

 1 package com.example.android_gson_json.http;
 2 
 3 import java.io.ByteArrayOutputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.net.HttpURLConnection;
 7 import java.net.URL;
 8 
 9 
10 //通过HttpURLCnnection获取链接里的数据,放到流里,然后把流里面的数据转换为字符串(借鉴于:老罗老版本1-04)
11 public class HttpUtils {
12 
13     public HttpUtils() {
14         // TODO Auto-generated constructor stub
15     }
16 
17     public static String getJsonContent(String url_path) {
18         try {
19             URL url = new URL(url_path);
20             HttpURLConnection connection = (HttpURLConnection) url
21                     .openConnection();
22             connection.setConnectTimeout(3000);
23             connection.setRequestMethod("GET");
24             connection.setDoInput(true);
25             int code = connection.getResponseCode();
26             if (code == 200) {
27                 return changeInputStream(connection.getInputStream());
28             }
29         } catch (Exception e) {
30             // TODO: handle exception
31         }
32         return "";
33     }
34 
35     private static String changeInputStream(InputStream inputStream) {
36         // TODO Auto-generated method stub
37         String jsonString = "";
38         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
39         int len = 0;
40         byte[] data = new byte[1024];
41         try {
42             while ((len = inputStream.read(data)) != -1) {
43                 outputStream.write(data, 0, len);
44             }
45             jsonString = new String(outputStream.toByteArray());
46         } catch (IOException e) {
47             // TODO Auto-generated catch block
48             e.printStackTrace();
49         }
50         return jsonString;
51     }
52 }

(3)【新建类Person】新建实体类Person,用于存放解析达成后的对象数据

 1 package com.example.android_gson_json.domain;
 2 
 3 public class Person {
 4     private int id;
 5     private String name;
 6     private String address;
 7     public Person() {
 8         super();
 9     }
10     public Person(int id, String name, String address) {
11         super();
12         this.id = id;
13         this.name = name;
14         this.address = address;
15     }
16     public int getId() {
17         return id;
18     }
19     public void setId(int id) {
20         this.id = id;
21     }
22     public String getName() {
23         return name;
24     }
25     public void setName(String name) {
26         this.name = name;
27     }
28     public String getAddress() {
29         return address;
30     }
31     public void setAddress(String address) {
32         this.address = address;
33     }
34     @Override
35     public String toString() {
36         return "Person [id=" + id + ", name=" + name + ", address=" + address
37                 + "]";
38     }    
39     
40 }

(4)【新建类GsonTools】确实用于解析Json数据

 1 package com.example.android_gson_json.gson;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import com.google.gson.Gson;
 7 import com.google.gson.reflect.TypeToken;
 8 
 9 public class GsonTools {
10 
11     public GsonTools() {
12         // TODO Auto-generated constructor stub
13     }
14 
15     //使用Gson进行解析Person
16     public static <T> T getPerson(String jsonString, Class<T> cls) {
17         T t = null;
18         try {
19             Gson gson = new Gson();
20             t = gson.fromJson(jsonString, cls);
21         } catch (Exception e) {
22             // TODO: handle exception
23         }
24         return t;
25     }
26     
27     
28     // 使用Gson进行解析 List<Person>
29     public static <T> List<T> getPersons(String jsonString, Class<T> cls) {
30         List<T> list = new ArrayList<T>();
31         try {
32             Gson gson = new Gson();
33             list = gson.fromJson(jsonString, new TypeToken<List<T>>() {
34             }.getType());
35         } catch (Exception e) {
36         }
37         return list;
38     }
39 
40 }

下边有四个章程,分别用于解析Person对象、List嵌套的Person。要是还有更复杂的数据类型,今后再说吧~O(∩_∩)O~那里只须要留意关键的笔触就行。

骨干代码:19至20行、32至34行

(5)在MainActicity中实例化:即实例化须要拜访的链接path并分析它

布局界面相当粗略,只有七个按钮控件,那里就不显示布局代码了。点击按钮后,触发点击事件,因为是Android4.0+,所以不可能在主线程中做客互联网,要求另起三个线程,那里运用Thread类。代码如下: 

 1 package com.example.android_gson_json;
 2 
 3 import java.util.List;
 4 
 5 import android.app.Activity;
 6 import android.os.Bundle;
 7 import android.util.Log;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 
12 import com.example.android_gson_json.domain.Person;
13 import com.example.android_gson_json.gson.GsonTools;
14 import com.example.android_gson_json.http.HttpUtils;
15 
16 public class MainActivity extends Activity implements OnClickListener {
17 
18     private Button button1, button2;
19     private static final String TAG = "MainActivity";
20 
21     @Override
22     protected void onCreate(Bundle savedInstanceState) {
23         super.onCreate(savedInstanceState);
24         setContentView(R.layout.activity_main);
25 
26         button1 = (Button) this.findViewById(R.id.button1);
27         button2 = (Button) this.findViewById(R.id.button2);
28         button1.setOnClickListener(this);
29         button2.setOnClickListener(this);
30     }
31 
32     //点击按钮,开始使用Gson解析Json数据:Person对象、List嵌套的Person对象的集合
33     @Override
34     public void onClick(final View v) {
35         Thread thread = new Thread(new Runnable() {
36 
37             @Override
38             public void run() {
39                 switch (v.getId()) {
40                 case R.id.button1:
41                     String path = "http://192.168.1.112:8080/person.json";
42                     String jsonString = HttpUtils.getJsonContent(path);//从网络获取数据
43                     Person person = GsonTools.getPerson(jsonString, Person.class);//解析json数据
44                     Log.i(TAG, person.toString());
45                     break;
46                 case R.id.button2:
47                     String path2 = "http://192.168.1.112:8080/persons.json";
48                     String jsonString2 = HttpUtils.getJsonContent(path2);//从网络获取数据
49                     List<Person> list = GsonTools.getPersons(jsonString2, Person.class);//解析json数据
50                     Log.i(TAG, list.toString());
51                     break;
52                 }
53 
54             }
55         });
56         thread.start();
57 
58     }
59 
60 }

中心代码:43行、49行

(6)添加网络权限:(这几个相对不要遗忘了)

<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET"/> 

程序运维在模拟器上运维后,界面如下:

XML 8

分级点击这五个按钮,后台打字与印刷的日记如下:

XML 9

在真机上运转的效率如下:

XML 10

证实Json数据解析成功,马到成功。

末尾申明:

骨子里,假设是在模拟器上运维,尽管不添加网络权限,也是没有提到的;然而,借使在真机上运转(前提是真机和处理器在同3个局域网),不添加网络权限,程序是纯属运维不了的,点击按钮,程序就会死掉,那么些地点又推延了本身半个时辰,罪过。

【工程文件】

链接:http://pan.baidu.com/s/1mgj0FY4

密码:61u3

 

相关文章

网站地图xml地图