JSON学习

来源:互联网 发布:matlab矩阵的取值 编辑:程序博客网 时间:2024/06/06 01:31

1.json的定义

json(JavaScript Object Notation) 是一种轻量级的数据交换格式,能够在服务器之间交换数据。在json出现之前,通用的数据交换语言是XML,但是XML的生成与解析比较麻烦。json的规格非常简单,规定如下:

(1)并列的数据之间用逗号(",")分隔

(2)映射用冒号(“:”)

(3)并列数据的集合(数组)用方括号(“[]”)表示

(4)映射的集合(对象)用大括号(“{}”)表示

2.json的构建方式

json简单说就是javascript中的对象和数组,所以json的构建结构就有对象和数组两种,通过这两种结构可以表示各种复杂的结构

(1)对象

对象在js中表示为“{}”扩起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。

举例:

{ "firstName": "Brett" }

{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }

(2)数组

数组在js中是中括号“[]”扩起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

举例:

{ "people": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
]}
这不难理解。在这个示例中,只有一个名为 people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录):
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] }
这里最值得注意的是,能够表示多个值,每个值进而包含多个值。

3.操作json数据

例子

var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },

{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
] }

(1)访问数据

要想访问 programmers 列表的第一个条目的姓氏,可以这样写

people.programmers[0].lastName;

(2)修改数据

people.musicians[1].lastName = "Rachmaninov";

(3)换回字符串

如果不能轻松地将对象转换回本文提到的文本格式,那么所有数据修改都没有太大的价值。在 JavaScript 中这种转换也很简单:

String newJSONtext = people.toJSONString();
这样就行了!现在就获得了一个可以在任何地方使用的文本字符串,例如,可以将它用作 Ajax 应用程序中的请求字符串。

4.使用json串

(1)json串转化为java类

不同平台互通时,会涉及到json串的传递。比如A要调用B的API,B的返回数据的格式如下

{"OcsInstances":
{"OcsInstance":
[
{
"Bandwidth":4.5,"Capacity":128,"ConnectionDomain":"m.jst.ocs.aliyuncs.com","Connections":50,"OcsInstanceId":"0c44e4dcf27611e2","OcsInstanceStatus":"Available","Port":11211,"Qps":300,"RegionId":"cn-hangzhou-cm10-01","UserName":"0c44e4dcf27611e2"
},
{
"Bandwidth":4.5,"Capacity":128,"ConnectionDomain":"m.jst.ocs.aliyuncs.com","Connections":50,"OcsInstanceId":"0c5baaf0f27611e2","OcsInstanceName":"111","OcsInstanceStatus":"Available","Port":11211,"Qps":300,"RegionId":"cn-hangzhou-cm10-01","UserName":"0c5baaf0f27611e2"
},
{
"Bandwidth":4.5,"Capacity":128,"ConnectionDomain":"m.jst.ocs.aliyuncs.com","Connections":50,"OcsInstanceId":"6e66955af39511e2","OcsInstanceName":"123","OcsInstanceStatus":"Available","Port":11211,"Qps":300,"RegionId":"cn-hangzhou-cm10-01","UserName":"6e66955af39511e2"
},
{
"Bandwidth":4.5,"Capacity":256,"ConnectionDomain":"m.jst.ocs.aliyuncs.com","Connections":50,"OcsInstanceId":"f4f69cd2f39f11e2","OcsInstanceName":"123","OcsInstanceStatus":"Available","Port":11211,"Qps":300,"RegionId":"cn-hangzhou-cm10-01","UserName":"f4f69cd2f39f11e2"
}
]
},
"RequestId":"1F9F97DE-F6C5-4F13-9075-F335B5358E56"
}

假如B要获得每条记录中OcsInstanceId、OcsInstanceName、OcsInstanceStatus的值,那么B如何解析呢,B一般会封装一个类,来对json串进行解析,类如下

public class ModifyOcsInstanceAttributeResponse extends AliyunResponse {

    private OcsInstances ocsInstances;//这里的OcsInstances就是上面的映射,ocsInstances里面包含数组OcsInstance,后面会定义

    public OcsInstances getOcsInstances() {
        return ocsInstances;
    }

    public void setOcsInstances(OcsInstances ocsInstances) {
        this.ocsInstances = ocsInstances;
    }
    //ocsInstances里面包含数组OcsInstance
    public static class OcsInstances {  
        private List<OcsInstance> ocsInstance;

        public List<OcsInstance> getOcsInstance() {
            return ocsInstance;
        }

        public void setOcsInstance(List<OcsInstance> ocsInstance) {
            this.ocsInstance = ocsInstance;
        }

    }
    //写OcsInstance的get、set三个属性(OcsInstanceId、OcsInstanceName、OcsInstanceStatus)的方法
    public static class OcsInstance implements Serializable {

        private String ocsInstanceId;
        private String ocsInstanceName;
        private String ocsInstanceStatus;

        public String getOcsInstanceId() {
            return ocsInstanceId;
        }

        public void setOcsInstanceId(String ocsInstanceId) {
            this.ocsInstanceId = ocsInstanceId;
        }

        public String getOcsInstanceName() {
            return ocsInstanceName;
        }

        public void setOcsInstanceName(String ocsInstanceName) {
            this.ocsInstanceName = ocsInstanceName;
        }

        public String getOcsInstanceStatus() {
            return ocsInstanceStatus;
        }

        public void setOcsInstanceStatus(String ocsInstanceStatus) {
            this.ocsInstanceStatus = ocsInstanceStatus;
        }

    }

}

(2)将后台数据以json串的形式给前端

比如后台数据为一个Map,我们要以json串的形式传给前台,我们可以这样写

 Map obj=new LinkedHashMap();  obj.put("name","foo");  obj.put("num",new Integer(100));  obj.put("balance",new Double(1000.21));  obj.put("is_vip",new Boolean(true));  obj.put("nickname",null);  String jsonText = JSONValue.toJSONString(obj);//将obj转化为json串的形式  System.out.print(jsonText);结果:{"name":"foo","num":100,"balance":1000.21,"is_vip":true,"nickname":null}