一、JSON
-
介绍
Json(Javascript Object Notation)是一种轻量级的数据交换格式。xml这种数据交换格式解析比较复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换。尤其是对于web开发来说,json数据格式在客户端直接可以通过javascript来进行解析。
-
数据格式 http://www.json.org/json-zh.html
(1). JsonObject对象:以 (key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。key值必须要是string类型。
(2). Json数组: 有序的value的集合,这种形式被称为是jsonArray,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
在这两种数据结构下,值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
-
Json应用
libs:http://sourceforge.net/projects/json-lib/files/json-lib/
(1). Java EE 5.0下导入如下包:
(2). 服务器端
关于toString的补充
http://blog.163.com/tangyang_personal/blog/static/4622961320082268951289/
JsonService.java
Json的几种数据格式:
/**
* 进行Json收发过程中的对应对象转换,即提供Json中的value
* @author FanFF
*
*/
public class JsonService {
public JsonService() {
super();
}
/**value是字符串
* {key:value, key:value,...}
* {"address":"beijing","id":1001,"name":"jack"}
* @return
*/
public Person getPerson() {
Person person = new Person(1001, "jack", "beijing");
return person;
}
/**value是数组[],数组又是{key:value}
* {key:[{key:value},{key:value},...]}
* [{"address":"beijing","id":1001,"name":"Smith"},{"address":"shanghai","id":1002,"name":"David"}]
* @return
*/
public List<Person> getlistPerson() {
List<Person> list = new ArrayList<Person>();
Person person1 = new Person(1001, "Smith", "beijing");
Person person2 = new Person(1002, "David", "shanghai");
list.add(person1);
list.add(person2);
return list;
}
/**
* {key:[value,value,value...]}
* {"person":["beijing","shanghai","guangzhou"]}
* @return
*/
public List<String> getListString() {
List<String> list = new ArrayList<String>();
list.add("beijing");
list.add("shanghai");
list.add("guangzhou");
return list;
}
/**
* {key:[{key:value , key:value,...},{key:value, key:value...}]}
* {"person":[{"id":1001,"address":"beijing","name":"Smith"},{"id":1002,"address":"David","name":"rose"}]}
* @return
*/
public List<Map<String, Object>> getListMaps() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("id", 1001);
map1.put("name", "Smith");
map1.put("address", "beijing");
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("id", 1002);
map2.put("name", "David");
map2.put("address", "David");
list.add(map1);
list.add(map2);
return list;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
JsonTools.java:
/**
* @param key
* @param value
* @return Json对象的字符串表示
*/
public static String createJsonString(String key, Object value){
JSONObject jsonobject = new JSONObject();
jsonobject.put(key, value);
return jsonobject.toString();
}
(3). Android端
解决方法:http://www.tuicool.com/articles/MvmeYr
方法一:在主线程中直接忽略,强制执行。(不推荐这种方法,但是该方法修改起来简单)。
在MainActivity文件的
setContentView(R.layout.activity_main)下面加上如下代码:
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
方法二:启动另一个线程执行网络连接任务,比如使用Thread、Runnable、Handler(推荐使用这种方法)。
/**
* 建立网络连接
* Created by FanFF on 2016/2/2.
*/
public class HttpUtils {
public HttpUtils() {
}
/**
* 通过URL获取服务器端通过JSon传来的数据
* @param url_path
* @return
*/
public static String getJsonContent(String url_path){
String jsonString = "";
try {
URL url = new URL(url_path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(3000);
connection.setRequestMethod("GET");
connection.setDoInput(true);
int code = connection.getResponseCode();
if (code == 200){
jsonString = changeInputStream(connection.getInputStream());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println("获取网络连接失败!");
}
return jsonString;
}
/**
* 将输入流转换为字符串
* @param inputStream
* @return
*/
private static String changeInputStream(InputStream inputStream) {
String jsonString = "";
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] data = new byte[1024];
try {
while ((len = inputStream.read(data))!=-1){
outputStream.write(data, 0, len);
}
jsonString = new String(outputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return jsonString;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
/**
* 将输入流转换为字符串
* @param inputStream
* @return
*/
private static String changeInputStream(InputStream inputStream) {
String jsonString = "";
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] data = new byte[1024];
try {
while ((len = inputStream.read(data))!=-1){
outputStream.write(data, 0, len);
}
jsonString = new String(outputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return jsonString;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 按照服务器端的封装对Json字符串进行各种格式的数据解析
/**
* 完成对json数据的解析
* Created by FanFF on 2016/2/3.
*/
public class JsonUtils {
public JsonUtils() {
}
/**
*例如:{"person":{"address":"beijing","id":1001,"name":"jack"}}
* @param key 即 person
* @param jsonString 即{"person":{"address":"beijing","id":1001,"name":"jack"}}
* @return
*/
public static Person getPerson(String key, String jsonString){
Person person = new Person();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONObject personObject = jsonObject.getJSONObject(key);
person.setId(personObject.getInt("id"));
person.setName(personObject.getString("name"));
person.setAddress(personObject.getString("address"));
} catch (JSONException e) {
e.printStackTrace();
}
return person;
}
/**
* {"persons":[{"address":"beijing","id":1001,"name":"Smith"},{"address":"shanghai","id":1002,"name":"David"}]}
* @param key
* @param jsonString
* @return
*/
public static List<Person> getPersons(String key, String jsonString){
List<Person> list = new ArrayList<Person>();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);
for (int i = 0; i < jsonArray.length(); i++){
JSONObject jsonObjectTemp = jsonArray.getJSONObject(i);
Person person = new Person();
person.setId(jsonObjectTemp.getInt("id"));
person.setName(jsonObjectTemp.getString("name"));
person.setAddress(jsonObjectTemp.getString("address"));
list.add(person);
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
/**
* {"liststring":["beijing","shanghai","guangzhou"]}
* @param key
* @param jsonString
* @return
*/
public static List<String> getList(String key, String jsonString){
List<String> list = new ArrayList<String>();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);
for (int i = 0; i < jsonArray.length(); i++){
String msg = jsonArray.getString(i);
list.add(msg);
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
/**
* {"listmap":[{"id":1001,"address":"beijing","name":"Smith"},{"id":1002,"address":"David","name":"David"}]}
* @param key
* @param jsonString
* @return
*/
public static List<Map<String, Object>> listKeyMaps(String key, String jsonString) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray(key);
for (int i = 0; i < jsonArray.length(); i++){
JSONObject jsonObjectTemp = jsonArray.getJSONObject(i);
Map<String, Object> map = new HashMap<String, Object>();
Iterator<String> iterator = jsonObjectTemp.keys();
while (iterator.hasNext()){
String json_key = iterator.next();
Object json_value = jsonObjectTemp.get(json_key);
if (json_value == null){
json_value = "";
}
map.put(json_key, json_value);
}
list.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
对应的服务器端类:
/**
* json字符串对应的服务器对象
* Created by FanFF on 2016/2/3.
*/
public class Person {
private int id;
private String name;
private String address;
public Person() {
}
public Person(int id, String name, String address) {
super();
this.id = id;
this.name = name;
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person [address=" + address + ", id=" + id + ", name=" + name
+ "]";
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
简单分析:服务端写入数据到相应的对象的属性中,客户端通过HttpUtils中的相应类获取网络中字节流并转化为字符串,然后解析字符串中的数据,提取该数据设置成相应的对象的属性。
二、Gson
- 介绍
Gson这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。 - 本质说明
使用Gson主要是在解析Json时利用了泛型和反射机制,避免了反复的复杂的迭代和set属性字段。这里就不做说明了。