JSON

1、什么是JSON?

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

Json数据格式:

  • json一共有两种数据格式
第一种格式
  • 以(key/value)对的形式存在的无序的jsonObject对象。一个对象以“{”开始,以“}”结束。每个“名称”后跟一个“:”;“名称/值”对之间使用“,”分割。
  • 对于这种数据格式,key值必须要是String类型,而对于value,可以是String、number、object、array、boolean、null等数据类型
{
    "name":"zack",
    "age":20
}

第二种格式

有序的value集合,这种形式被称为jsonArray,数组是值(value)的有序集合。一个数组以“[”开始,以“]”结束,值之间使用“,”分隔。

{
    "student":
    [
    {"name":"zack","age":20},
    {"name":"jack","age":25}
    ]
}

2.Json数据类型

2-1json对象

  • json对象在花括号中书写;
  • 对象包含多个名称/值对;
{"firstname":"John","lastname":"Doe"}

2-2json数组

  • json数组在方括号中书写
  • 数组可包含多个对象
{
    "employees":[
    {"firstname":"alex","lastname":"andy"},
    {"firstname":"zack","lastname":"herry"}
    ]
}

ps:jsonObject与jsonArray的区别

json数组
{
    "cat":"it",
    "language":[
        {"id":1,"ide":"eclipse","name":Java},
        {"id":2,"ide":"XCode","name":"Swift"},
        {"id":3,"ide":"Visual Stdio","name":"C#"}     
    ],
    "pop":true
}
json对象
{
    "name": "Tim",
    "info": {
        "score": {
            "english": "A",
            "math": "B"
        },
        "age": 20
    }
}

3、org.json

org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类.和其他解析工具相比要轻量的多只需要导入org,json的jar包即可,不用依赖其他的jar包。其他不同之处在这里不做介绍了

3.1解析案例以及代码案例

解析json对象

package test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;

public class ReadJson {
    // 简单的json测试字符串
    public static final  String JSON_SIMPLE = "{'name':'tom','age':16}";
    //嵌套的json测试字符串
    public static final String JSON_MULTI = "{'name':'tom','score':{'Math':98,'English':90}}";
    public static void main(String [] args){
        printSimple();
        printMulit();
    }

    //解析json数据
    public static Map<String, String> toMap(String jsonString) throws JSONException  {  

        JSONObject jsonObject = new JSONObject(jsonString);  

        Map<String, String> result = new HashMap<String, String>();  
        Iterator<?> iterator = jsonObject.keys();  
        String key = null;  
        String value = null;  

        while (iterator.hasNext()) {  

            key = (String) iterator.next();  
            value = jsonObject.getString(key);  
            result.put(key, value);  

        }  
        return result;  
    }  

   //输出简单的json格式数据
    public static  void printSimple(){ 
        String jsonString=JSON_SIMPLE;
        Map<String, String> map=null;
        try {
            map=toMap(jsonString);
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String name=map.get("name");
        String age=map.get("age");
        System.out.println(name+"------"+age);
    }
    //输出嵌套的json格式出去
    public static void printMulit(){
        String jsonString=JSON_MULTI;
        Map<String, String> map=null;
        Map<String, String> map1=null;
        try {
            map=toMap(jsonString);
            String name=map.get("name");
            String score=map.get("score");
            map1=toMap(score);
            String Math=map1.get("Math");
            String English=map1.get("English");
            System.out.println(name+"-"+Math+"-"+English);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

解析json数组

package test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class ReadJson2 {
    //json字符串
    static String JsonStr = "{object:{persons:" +
            "[{name:'呵呵',image:'http://10.0.159.132:8080/Web/s1.png'}," +
            "{name:'哈哈',image:'http://10.0.159.132:8080/Web/s1.png'}," +
            "{name:'嘿嘿',image:'http://10.0.159.132:8080/Web/s2.jpg'}]}}";
    public static void main(String []args) throws JSONException{
        List<Person> list=jsonStrToList(JsonStr);
        Iterator<Person> it = list.iterator();
        while(it.hasNext()){
            Person p = (Person) it.next();
            System.out.println(p.getName()+"--"+p.getImage());
        }
    }

    /**
     * 解析json数组中的jsonObject
     * @param jsonStr
     * @return
     * @throws JSONException
     */
    public static List<Person> jsonStrToList(String jsonStr) throws JSONException{
        List<Person> list=new ArrayList<Person>();

        //通过字符串,获得最外部的json对象
        JSONObject jsonObj=new JSONObject(jsonStr);
        //通过属性名,获得内部的对象
        JSONObject jsonPersons=jsonObj.getJSONObject("object");
        //获得json对象组
        JSONArray arr=jsonPersons.getJSONArray("persons");
        for(int i=0;i<arr.length();i++){
            //循环对象,并通过getString("属性名");来获得值
            JSONObject tempJson=arr.getJSONObject(i);
            Person person=new Person();

            person.setName(tempJson.getString("name"));
            person.setImage(tempJson.getString("image"));
            list.add(person);
        }
        return list;

    }
}

3.2构造案例及代码

JSONObject的构造json

package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;

public class writeJson {
    public static void constructorTest() throws JSONException {

        String jsonStr = "{'name':'JTZen9','age':21}";
        JSONObject strJson;

        // 传入字符串
        strJson = new JSONObject(jsonStr);
        System.out.println("构造参数为String类:" + strJson);

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("age", 21);
        map.put("sex", "male");
        map.put("name", "JTZen9");
        JSONObject mapJson = new JSONObject(map); // 传入Map类型
        System.out.println("构造参数为Map类:" + mapJson);

        Student student = new Student();
        student.setAge(21);
        student.setName("JTZen9");
        student.setSex("male");
        JSONObject beanJson = new JSONObject(student); // 传入Bean类型
        System.out.println("构造参数为Bean类:" + beanJson);
    }  

        public static void putMethodTest() throws JSONException {  

            JSONObject jsonObject1 = new JSONObject();  
            jsonObject1.put("bookName", "JTZen9");  
            jsonObject1.put("age", 21);  
            System.out.println(jsonObject1);  

            JSONObject jsonObject2 = new JSONObject();  
            List<Object> list = new ArrayList<Object>();  
            for (int i = 1; i < 3; i++) {  
                Map<String , Object> map = new HashMap<String ,Object>();  
                map.put("title", "java程序设计 第" + i + "版");  
                map.put("price", i*20);  
                list.add(map);  
            }  
            jsonObject2.put("book", list);  
            System.out.println(jsonObject2);  

            Student student = new Student();  
            student.setAge(21);  
            student.setName("JTZen9");  
            student.setSex("male");  
            jsonObject2 = new JSONObject(student);  
            JSONObject jsonObject3 = new JSONObject();  
            jsonObject3.put("people", jsonObject2);   //不可以直接传bean类对象put("people",student)  
            System.out.println(jsonObject3);  
        }  

        public static void main(String[] args) throws Exception {  
            constructorTest();  
            System.out.println("---------------------------------------------------------");  
            putMethodTest();  
        }   
}

JSONArray构造json

package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;

public class JsonArrayTest {
    public static void constructorTest() throws JSONException {  

        String jsonStr = "[{'name':'JTZen9','age':21}]";  
        JSONArray strJson = new JSONArray(jsonStr);     // 传入字符串  
        System.out.println("构造参数为String类:" + strJson);  

        List<Object> list = new ArrayList<Object>();  
        for (int i = 1; i < 3; i++) {  
            Map<String ,Object> map = new HashMap<String, Object>();  
            map.put("title", "java程序设计 第" + i + "版");  
            map.put("price", i*20);  
            list.add(map);  
        }  
        JSONArray mapJson = new JSONArray(list);        // 传入Collection类型  
        System.out.println("构造参数为Collection类:" + mapJson);  

        int[] numlist = new int[10];  
        for (int i = 0; i < numlist.length; i++) {  
            numlist[i] = i;  
        }  
        JSONArray arrayJson = new JSONArray(numlist);   // 传入Array类型,实例1  
        System.out.println(arrayJson);  

        Student[] student = {new Student(),new Student()};  
        student[0].setAge(21);  
        student[0].setName("JTZen9");  
        student[0].setSex("male");  
        student[1].setAge(21);  
        student[1].setName("heiheihei");  
        student[1].setSex("female");  
        JSONArray beanJson = new JSONArray(student);    // 传入Array类型,实例2  
        System.out.println("构造参数为Array类:" + beanJson);  
    }  

     public static void putMethodTest() throws JSONException {  
            JSONArray jsonArray1 = new JSONArray();  
            jsonArray1.put("JTZen9");  
            jsonArray1.put(21);  
            jsonArray1.put("male");  
            System.out.println(jsonArray1);  

            JSONArray jsonArray2 = new JSONArray();  
            Map<String ,Object> map = new HashMap<String ,Object>();  
            map.put("title", "java程序设计 第2版");  
            map.put("price", 20);  
            jsonArray2.put(map);        //传入一个map  
            System.out.println("传入一个Map:" + jsonArray2);  
            map.clear();  
            map.put("title", "java程序设计 第3版");  
            map.put("price", 30);  
            jsonArray2.put(map);        //没有下标的直接在结果后面添加  
            System.out.println("没有指定下标:" + jsonArray2);  
            map.clear();  
            map.put("title", "java程序设计 第1版");  
            map.put("price", 10);  
            jsonArray2.put(0,map);      //使用下标可以添加到自定义的位置  
            System.out.println("添加到第一个位置:" + jsonArray2);  

            Student[] student = { new Student(), new Student() };  
            student[0].setAge(21);  
            student[0].setName("JTZen9");  
            student[0].setSex("male");  
            student[1].setAge(21);  
            student[1].setName("heiheihei");  
            student[1].setSex("female");  
            JSONArray jsonArray3 = new JSONArray();   
            jsonArray3.put(student);  
            System.out.println("注意输出结果:" + jsonArray3);  

        }  
    public static void main(String[] args) throws JSONException {  
        constructorTest();  
        System.out.println("-------------------------------------------------");
        putMethodTest();
    }  
}

JSONStringer.java & JSONWriter.java

package test;

import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONStringer;
import org.json.JSONWriter;

public class JSONWriterStringerTest {
    public static void JSONStringerTest() throws Exception {  

        PrintWriter writer = new PrintWriter("test.txt");  
        JSONWriter jsonWriter = new JSONWriter(writer);  
        jsonWriter.object().key("name").value("JTZen9").key("age").value(21).key("sex").value("male").endObject();  
        writer.flush();  
        writer.close();  

        Map<String ,Object> map1 = new HashMap<String ,Object>();  
        map1.put("age", 21);  
        map1.put("sex", "male");  
        map1.put("name", "jtzen9");  
        Map<String ,Object> map2 = new HashMap<String ,Object>();  
        map2.put("age", 21);  
        map2.put("sex", "female");  
        map2.put("name", "heiheihei");  
        JSONStringer jsonStringer = new JSONStringer();  
        jsonStringer.array().value(map1).value(map2).endArray();  
        System.out.println(jsonStringer);  
    }  

    public static void main(String[] args) throws Exception {  
        JSONStringerTest();  
    }  
}

test.txt中的内容
{"name":"JTZen9","age":21,"sex":"male"}

JSONTokener

  • JSONTokener读取包含json格式数据的文件,然后可以将JSONTokener对象作为参数来构造JSONObject或JSONArray,然后再进行相应的解析。
  • 以上面的test.txt为例,简单代码示例如下:
package test;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import org.json.JSONObject;
import org.json.JSONTokener;

public class JSONTokenerTest {
    public static void readJsonFile() throws Exception {

        FileReader fr = new FileReader("test.txt");

        BufferedReader bufr = new BufferedReader(fr);
        String jsonStr = "";
        String line = null;
        StringBuffer sb = new StringBuffer();
        while ((line = bufr.readLine()) != null) {
            sb.append(line);
        }
        jsonStr = sb.toString();
        bufr.close();
        JSONTokener jsonTokener = new JSONTokener(jsonStr);
        JSONObject jsonObject = new JSONObject(jsonTokener);
        System.out.println(jsonObject);
        System.out.println("姓名:" + jsonObject.getString("name"));
        System.out.println("年龄:" + jsonObject.getInt("age"));
    }  

        public static void main(String[] args) throws Exception {  
            readJsonFile();  
        }   
}

解析文件中的json格式数据

json.txt

[  
        {  
            "institute":{  
                "name":"Software Institute",  
                "grade":[  
                    {  
                        "name":"freshman",  
                        "class":[  
                            {  
                                "no.":1,  
                                "students":61  
                            },  
                            {  
                                "no.":2,  
                                "students":62  
                            },  
                            {  
                                "no.":3,  
                                "students":63  
                            }  
                        ]  
                    },  
                    {  
                        "name":"sophomore",  
                        "class":[  
                            {  
                                "no.":1,  
                                "students":51  
                            },  
                            {  
                                "no.":2,  
                                "students":52  
                            },  
                            {  
                                "no.":3,  
                                "students":53  
                            }  
                        ]  
                    },  
                    {  
                        "name":"junior",  
                        "class":[  
                            {  
                                "no.":1,  
                                "students":41  
                            },  
                            {  
                                "no.":2,  
                                "students":42  
                            },  
                            {  
                                "no.":3,  
                                "students":43  
                            }  
                        ]  
                    }  
                ]  
            }  
        }  
    ]

取grade为sophomore的no.等于3的students数量,那么代码如下:

package test;

import java.io.BufferedReader;
import java.io.FileReader;

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

public class JSONTest {
     public static void main(String[] args) throws Exception {  
         FileReader fr = new FileReader("json.txt");

            BufferedReader bufr = new BufferedReader(fr);
            String jsonStr = "";
            String line = null;
            StringBuffer sb = new StringBuffer();
            while ((line = bufr.readLine()) != null) {
                sb.append(line);
            }
            jsonStr = sb.toString();
            bufr.close();
            JSONTokener jsonTokener = new JSONTokener(jsonStr);  
            JSONArray jsonArray = new JSONArray(jsonTokener);//获取整个json文件的内容,因为最外层是数组,所以用JSONArray来构造  
            System.out.println(jsonArray);  

            //这个JSONArray数组只包含一个JSONObject对象,标为jsonObject1  
            JSONObject jsonObject1 = jsonArray.getJSONObject(0);  
            System.out.println(jsonObject1);   

            //jsonObject1只包含一个institute字段,这里获取这个字段内容赋给jsonObject2  
            JSONObject jsonObject2 = jsonObject1.getJSONObject("institute");  
            System.out.println(jsonObject2);  

            //jsonObject2包含name字段和grade字段,grade字段对应的是一个JSONArray数组  
            String valueOfname = jsonObject2.getString("name");  
            System.out.println(valueOfname);  
            JSONArray jsonArray2 = jsonObject2.getJSONArray("grade");  
            System.out.println(jsonArray2);  

            //jsonArray2数组包含3个对象,每个对象里面有name字段和class字段,这里获取第二个对象  
            JSONObject jsonObject3 = jsonArray2.getJSONObject(1);  
            System.out.println(jsonObject3);  

            //然后从jsonObject3对象里获取class字段对应的JSONArray数组  
            JSONArray jsonArray3 = jsonObject3.getJSONArray("class");  
            System.out.println(jsonArray3);  

            //下面直接获取no.等于3的students数量,过程都一样  
            int num = jsonArray3.getJSONObject(2).getInt("students");  
            System.out.println("最后获取的结果为:" + num);  
        }  
}