关闭

Json 数据的解析 ,生成

标签: 数据结构-json
533人阅读 评论(0) 收藏 举报
分类:

json详解


一. json定义:(通俗地说—其实就是android中客户端与服务器端交互的一种数据类型,类似xml,一般在数据传输时使用)


二. json的格式:

    创建json对象时,以 { 开始, 以 } 结束,对象的每个属性名与属性值之间以英文的 : 隔开,多个属性间以 , 隔开.  
必须注意的是:  并不是每个属性值的后面都有英文 , .必须在后面还有属性时才需要 ,  

一般有两种:

  1. 最长见的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;
    }
}
  1. 形如 此类:
{ 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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:100534次
    • 积分:2076
    • 等级:
    • 排名:第18498名
    • 原创:108篇
    • 转载:8篇
    • 译文:0篇
    • 评论:10条
    最新评论