json详解
一. json定义:(通俗地说—其实就是android中客户端与服务器端交互的一种数据类型,类似xml,一般在数据传输时使用)
二. json的格式:
创建json对象时,以 { 开始, 以 } 结束,对象的每个属性名与属性值之间以英文的 : 隔开,多个属性间以 , 隔开.
必须注意的是: 并不是每个属性值的后面都有英文 , .必须在后面还有属性时才需要 ,
一般有两种:
最长见的json对象
{ key1:value1,
key2:value2 }value — 可以数组,也可以是json对象
{
"address": {
"country": "china",
"province": "zhengzhou"
},
"age": 18,
"married": false,
"name": "fy",
"phone": [
"110",
"13783635955"
]
}
此类json的解析 借助gson
Gson gson = new Gson();
bean bean = gson.fromJson(JSONString, bean.class); //JSONString为json对象
String name = bean.getName();// fy
String country = bean.getAddress().getCountry();//china
String phone = bean.getPhone().get(1);//110
对应的bean类:
public class bean{
/**
* country : china
* province : zhengzhou
*/
private AddressEntity address;
/**
* address : {"country":"china","province":"zhengzhou"}
* age : 18
* married : false
* name : fy
* phone : ["110","13783635955"]
*/
private int age;
private boolean married;
private String name;
private List<String> phone;
public void setAddress(AddressEntity address) {
this.address = address;
}
public void setAge(int age) {
this.age = age;
}
public void setMarried(boolean married) {
this.married = married;
}
public void setName(String name) {
this.name = name;
}
public void setPhone(List<String> phone) {
this.phone = phone;
}
public AddressEntity getAddress() {
return address;
}
public int getAge() {
return age;
}
public boolean isMarried() {
return married;
}
public String getName() {
return name;
}
public List<String> getPhone() {
return phone;
}
public static class AddressEntity {
private String country;
private String province;
public void setCountry(String country) {
this.country = country;
}
public void setProvince(String province) {
this.province = province;
}
public String getCountry() {
return country;
}
public String getProvince() {
return province;
}
}
}
2 . 形如 以数组存储json对象
[
{
"age": 18,
"name": "jack"
},
{
"age": 21,
"name": "rose"
}
]
此类json的解析 借助gson
JSONArray jsonArray = new JSONArray(JSONString);//首先将数据转换为数组
System.out.println("数组的长度为" + jsonArray.length());
for(int i=0;i<jsonArray.length();i++){ //遍历数组中的json
JSONObject obj = jsonArray.optJSONObject(i);//得到的obj为{name:jack,age:18}
Gson gson = new Gson(); //使用gson去解析.
bean bean = gson.fromJson(String.valueOf(obj), bean.class);//bean为json数据对应的bean类
}
对应的bean类为:
public class bean {
/**
* age : 20
* name : jack
*/
private int age;
private String name;
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
- 形如 此类:
{ code:"0001",
message:{
name:"fy",
year:"2008"
//也许message中还有其他字段
}
}
有时我们知道code,message是确定的, 但是message中的字段是不确定的.这样我们就要先得到code根据不同的code去找对应的message的bean类.
JSONObject json = null;
String code_order = null;
String message = "";
// 先将数据的code解析出来
json = new JSONObject(data);
code_order = (String) json.getString("code");
message = json.getString("message");
//根据code找到对应的message的bean类
bean fromJson = gson.fromJson(message,com.example.pf.bean.class);
String name = fromJson.getSFZH();
String card = fromJson.getSFZXM();
三. JSONObject, JSONArray来构建json文本
生成下面的一个json文本:
假设现在要创建这样一个json文本
{
"phone" : ["12345678", "87654321"], // 数组
"name" : "jack", // 字符串
"age" : 100, // 数值
"address" : { "country" : "china", "province" : "zhengzhou" }, // 对象
"married" : false // 布尔值
}
try {
// 首先最外层是{},是创建一个对象
JSONObject person = new JSONObject();
// 第一个键phone的值是数组,所以需要创建数组对象
JSONArray phone = new JSONArray();
phone.put("12345678").put("87654321");
person.put("phone", phone);
person.put("name", "yuanzhifei89");
person.put("age", 100);
// 键address的值是对象,所以又要创建一个对象
JSONObject address = new JSONObject();
address.put("country", "china");
address.put("province", "jiangsu");
person.put("address", address);
person.put("married", false);
} catch (JSONException ex) {
// 键为null或使用json不支持的数字格式(NaN, infinities)
throw new RuntimeException(ex);
}
寄语:
以后再也不用担心碰到json不会解析的问题了.关于复杂数组型json解析请移步:
http://blog.csdn.net/fengltxx/article/details/51035430