JSON

1.什么是JSON
JSON是指JavaScript对象表示法( Java Script Object Notation)。
JSON是轻量级的文本数据交换格式。
JSON独立于语言。
JSON具有自我描述性(即人可读懂)。
JSON具有层级机构(即值仍然可以是对象)。
JSON使用JavaScript语法描述数据对象,但是JSON独立于语言和平台。

2.JSON vs. XML
1)JSON更短。JSON通常用于客户端与服务器端数据交互,数据更短的话通过网络交互流量更小,就会更省时。
2)JSON更快。使用XML需要通过DOM来遍历整个XML文档,而使用JSON的话速度会更快。
两者的性能比较代码,用Gson解析JSON,用DOM4J解析XML。
public class PerformanceMain {
    public static int COUNT = 10000;
    public static void main(String[] args) throws Exception{
        long startTime = System.currentTimeMillis();
        for(int i =0;i<COUNT;i++)
            readXml2Bean();
        System.out.println(System.currentTimeMillis() - startTime);
    }
    private static void readJson2Bean() throws Exception{
        String json = " {\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"}";
        Gson gson = new Gson();
        Person person =  gson.fromJson(json, Person.class);
    }
    private static void readXml2Bean() throws Exception{
        String xml = "<root>\n" +
                "<name>frank1234</name>\n" +
                "<address>\n" +
                "\t<city>北京市</city>\n" +
                "\t<street>海淀</street>\n" +
                "\t<postcode>220000</postcode>\n" +
                "</address>\n" +
                "</root>";
        SAXReader reader = new SAXReader();
        Document doc = null;
        InputStream in = new ByteArrayInputStream(xml.getBytes("UTF-8"));
        try {
            doc = reader.read(in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Element root = doc.getRootElement();
        Element name = root.element("name");
        Element address = root.element("address");
        Element city = address.element("city");
        Element street = address.element("street");
        Element postcode = address.element("postcode");
    }
}
运行结果:
XML解析方式:耗时2873ms
JSON解析方式:耗时483ms
可见两者的速度差异还是很大的。

3.JSON数据格式
3.1.JSON取值
1)数字(整数或者浮点数)
2)字符串(在双引号中)
3)逻辑值(true或者false)
3)数组(在方括号中)
4)对象(在花括号中)
5)null
整数、逻辑值还有null,均不能放在""中,否则就变成了字符串值了。

3.2.JSON语法规则
1)数据在名称/值对中。
2)数据由逗号分隔
3)花括号保存对象
4)方括号保存数组

3.3.示例
1)单值
"city":"北京市"
2)对象
{"city":"北京市","street":"海淀","postcode":220000}
3)复杂对象
{"name":"frank1234","address":{"city":"北京市","street":"海淀","postcode":220000}}
下面的示例程序均以这个JSON对象为例。
4)数组
[{"name":"frank1234","address":{"city":"北京市","street":"海淀","postcode":220000}},{"name":"Obama","address":{"city":"New York","street":"Wall Street","postcode":11111111}}]

4.JavaScript处理JSON
<html>
<body>
<h2>在 JavaScript 中创建 JSON 对象</h2>


Name: <span id="name"></span>

Address: <span id="address"></span>





Name Array[1]: <span id="namearray"></span>

Address Array[1]: <span id="addressarray"></span>





<script type="text/javascript">
var JSONObject= {"name":"frank1234","address":{"city":"北京市","street":"海淀","postcode":220000}};
document.getElementById("name").innerHTML= JSONObject.name
document.getElementById("address").innerHTML=JSONObject.address.city +":" +JSONObject.address.street+ ":"+JSONObject.address.postcode


var JSONObjectArray = [{"name":"frank1234","address":{"city":"北京市","street":"海淀","postcode":220000}},{"name":"Obama","address":{"city":"New York","street":"Wall Street","postcode":11111111}}];
document.getElementById("namearray").innerHTML=JSONObjectArray[1].name
document.getElementById("addressarray").innerHTML= JSONObjectArray[1].address.city +":" +JSONObjectArray[1].address.street+ ":"+JSONObjectArray[1].address.postcode

</script>

</body>
</html>

5.Servlet返回JSON

response.setContentType("application/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.write(json);
pw.flush();

6.服务器端json解析
6.1.jackson
需要引入jackson-all-1.6.4.jar
public class JacksonMain {
    private static JsonGenerator jsonGenerator = null;
    private static ObjectMapper objectMapper = null;
    private static void init() throws Exception{
        objectMapper = new ObjectMapper();
        jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
    }
    private static void close() throws Exception{
        if (jsonGenerator != null) {
            jsonGenerator.flush();
        }
        if (!jsonGenerator.isClosed()) {
            jsonGenerator.close();
        }
        jsonGenerator = null;
        objectMapper = null;
    }
    public static void main(String[] args) throws Exception{
        init();
//        writeBean2Json();
//        writeList2Json();
//        readJson2Bean();
        readJson2List();
        close();
    }
    private static void writeBean2Json() throws  Exception{
        Address address = new Address();
        address.setCity("北京市");
        address.setStreet("海淀");
        address.setPostcode(220000);
        Person person = new Person();
        person.setName("frank1234");
        person.setAddress(address);
        jsonGenerator.writeObject(address);
        System.out.println();
        jsonGenerator.writeObject(person);
        System.out.println();
    }
    private static void writeList2Json() throws Exception{
        Address address1 = new Address();
        address1.setCity("北京市");
        address1.setStreet("海淀");
        address1.setPostcode(220000);
        Person person1 = new Person();
        person1.setName("frank1234");
        person1.setAddress(address1);
        List<Person> list = new ArrayList<Person>();
        list.add(person1);

        Address address2 = new Address();
        address2.setCity("New York");
        address2.setStreet("Wall Street");
        address2.setPostcode(11111111);
        Person person2 = new Person();
        person2.setName("Obama");
        person2.setAddress(address2);
        list.add(person2);
        jsonGenerator.writeObject(list);

        System.out.println();
    }
    private static void readJson2Bean() throws Exception{
        String json = " {\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"}";
        Person person = objectMapper.readValue(json, Person.class);
        System.out.println(person);
    }
    private static void readJson2List() throws Exception{
        String json = " [{\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"},{\"address\":{\"city\":\"New York\",\"street\":\"Wall Street\",\"postcode\":11111111},\"name\":\"Obama\"}]";
        Person[] persons = objectMapper.readValue(json, Person[].class);
        List<Person> list  = new ArrayList<Person>();
        for (int i = 0; i < persons.length; i++) {
            Person person = persons[i];
            System.out.println(person);
            list.add(person);
        }
    }
}


6.2.jsonlib
需要引入:
commons-beanutils.jar
commons-collections.jar
commons-lang.jar
commons-logging.jar
ezmorph-1.0.6.jar
json-lib-2.4-jdk15.jar

public class JsonlibMain {
    public static void main(String[] args) throws Exception{
//        writeBean2Json();
//        writeList2Json();
//        readJson2Bean();
        readJson2List();
    }
    private static void writeBean2Json() throws  Exception{
        Address address = new Address();
        address.setCity("北京市");
        address.setStreet("海淀");
        address.setPostcode(220000);
        Person person = new Person();
        person.setName("frank1234");
        person.setAddress(address);
        System.out.println(JSONObject.fromObject(address));
        System.out.println(JSONSerializer.toJSON(person));

    }
    private static void writeList2Json() throws Exception{
        Address address1 = new Address();
        address1.setCity("北京市");
        address1.setStreet("海淀");
        address1.setPostcode(220000);
        Person person1 = new Person();
        person1.setName("frank1234");
        person1.setAddress(address1);
        List<Person> list = new ArrayList<Person>();
        list.add(person1);

        Address address2 = new Address();
        address2.setCity("New York");
        address2.setStreet("Wall Street");
        address2.setPostcode(11111111);
        Person person2 = new Person();
        person2.setName("Obama");
        person2.setAddress(address2);
        list.add(person2);
        System.out.println(JSONArray.fromObject(list));
    }
    private static void readJson2Bean() throws Exception{
        String json = " {\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"}";
        Person person = (Person)JSONObject.toBean(JSONObject.fromObject(json),Person.class);
        System.out.println(person);
    }
    private static void readJson2List() throws Exception{
        String json = " [{\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"},{\"address\":{\"city\":\"New York\",\"street\":\"Wall Street\",\"postcode\":11111111},\"name\":\"Obama\"}]";
        List<Person> list = JSONArray.toList(JSONArray.fromObject(json), Person.class);
        for (int i = 0; i < list.size(); i++) {
            Person person = list.get(i);
            System.out.println(person);
        }
    }
}


6.3.Gson
需要引入:gson-2.1.jar
public class GsonMain {
    public static void main(String[] args) throws Exception{
//        writeBean2Json();
        writeList2Json();
        //readXml2Bean();


//        readJson2List();
    }
    private static void writeBean2Json() throws  Exception{
        Address address = new Address();
        address.setCity("北京市");
        address.setStreet("海淀");
        address.setPostcode(220000);
        Person person = new Person();
        person.setName("frank1234");
        person.setAddress(address);
        Gson gson = new Gson();
        System.out.println(gson.toJson(address));
        System.out.println(gson.toJson(person));
    }
    private static void writeList2Json() throws Exception{
        Address address1 = new Address();
        address1.setCity("北京市");
        address1.setStreet("海淀");
        address1.setPostcode(220000);
        Person person1 = new Person();
        person1.setName("frank1234");
        person1.setAddress(address1);
        List<Person> list = new ArrayList<Person>();
        list.add(person1);

        Address address2 = new Address();
        address2.setCity("New York");
        address2.setStreet("Wall Street");
        address2.setPostcode(11111111);
        Person person2 = new Person();
        person2.setName("Obama");
        person2.setAddress(address2);
        list.add(person2);
        Gson gson = new Gson();

        System.out.println(gson.toJson(list));
    }
    private static void readJson2Bean() throws Exception{
        String json = " {\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"}";
        Gson gson = new Gson();
        Person person =  gson.fromJson(json, Person.class);
        System.out.println(person);
    }

    private static void readJson2List() throws Exception{
        String json = " [{\"address\":{\"city\":\"北京市\",\"street\":\"海淀\",\"postcode\":220000},\"name\":\"frank1234\"},{\"address\":{\"city\":\"New York\",\"street\":\"Wall Street\",\"postcode\":11111111},\"name\":\"Obama\"}]";
        Gson gson = new Gson();
        Person[] persons = gson.fromJson(json,Person[].class);
        List<Person> list = new ArrayList<Person>();
        for (int i = 0; i < persons.length; i++) {
            Person person = persons[i];
            System.out.println(person);
            list.add(person);
        }
    }
}



笔者最喜欢Gson的处理方式,简洁清晰。


7.参考资料
http://www.ibm.com/developerworks/cn/web/wa-lo-json/
http://www.cnblogs.com/worfdream/articles/1956449.html
http://fjg0427.iteye.com/blog/1840074
http://www.w3school.com.cn/json/index.asp
http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html
http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html

你可能感兴趣的:(json,gson,Jackson,json-lib)