1. 程式人生 > >fastjson的JSONArray和JSONObject

fastjson的JSONArray和JSONObject

什麼是JSON?

JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。 易於人閱讀和編寫。同時也易於機器解析和生成。 它基於javascript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON採用完全獨立於語言的文字格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的資料交換語言。
現在我們就來研究一下fastJson。

Fastjson是國內著名的電子商務網際網路公司阿里巴巴內部開發的用於java後臺處理json格式資料的一個工具包,包括“序列化”和“反序列化”兩部分,它具備如下特徵

1. 速度最快,測試表明,fastjson具有極快的效能,超越任其他的java json parser。包括自稱最快的jackson。
2. 功能強大,完全支援java bean、集合、Map、日期、Enum,支援範型,支援自省。
3. 無依賴,能夠直接執行在Java SE 5.0以上版本
4. 支援Android。

JSONObject 與JSONArray

  • JSONObject
json物件,就是一個鍵對應一個值,使用的是大括號{ },如:{key:value}
  • JSONArray
json陣列,使用中括號[ ],只不過數組裡面的項也是json鍵值對格式的

Json物件中是新增的鍵值對,JSONArray中新增的是Json物件

例子
/**
 * Created by wanggs on 2017/7/27.
 */

public class JsonTest {
    public static void main(String[] args) {

       // Json物件中是新增的鍵值對,JSONArray中新增的是Json物件
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject1 = new JSONObject(); JSONArray jsonArray = new JSONArray(); jsonObject1.put("001","tom"); // JSONObject 物件中新增鍵值對 jsonObject.put("key","value"); // 將JSONObject物件新增到json陣列中 jsonArray.add(jsonObject); jsonArray.add(jsonObject1); System.out.println(jsonArray.toString()); // 輸出結果: [{"key":"value"},{"001":"tom"}] } }
先來個官方例子
package com.wanggs.com.wanggs.json.fastjson;

import java.util.List;

/**
 * Created by wanggs on 2017/7/27.
 */
public class Group {
    private int id;
    private String name;
    List<User> users;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }
}

class User{
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.wanggs.com.wanggs.json.fastjson;

import com.alibaba.fastjson.JSON;

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

/**
 * Created by wanggs on 2017/7/27.
 */
public class FastJsonTest {
    public static void main(String[] args) {
        Group group = new Group();
        group.setId(0);
        group.setName("admin");

        User user = new User();
        user.setId(001);
        user.setName("guest");
        User user1 = new User();
        user1.setId(002);
        user1.setName("root");
        List<User> users = new ArrayList<User>();
        users.add(user);
        users.add(user1);

        group.setUsers(users);

        String json = JSON.toJSONString(group);
        System.out.println(json);

        // 輸出: {"id":0,"name":"admin","users":[{"id":1,"name":"guest"},{"id":2,"name":"root"}]}
    }
}

下面給出fastJson處理json資料格式的程式碼樣例:

package test.com.wanggs.com.wanggs.json.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.wanggs.com.wanggs.json.fastjson.People;
import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Created by wanggs on 2017/7/27.
 */
public class FastJsonTestTest {

    /**
     * 序列化
     */
    @Test
    public void toJsonString() {
        People people = new People("001","tom",12);
        String text = JSON.toJSONString(people);
        System.out.println(text);

        // 輸出結果: {"age":12,"id":"001","name":"tom"}
    }

    /**
     * 反序列為Json物件
     */
    @Test
    public void parseJsonObject(){
        String text = "{\"age\":12,\"id\":\"001\",\"name\":\"tom\"}";
        People people = (People) JSON.parseObject(text,People.class);
        System.out.println("parseBeanObject()方法:people==" + people.getId() + "," + people.getName() + "," + people.getAge());

        // 輸出結果為: parseBeanObject()方法:people==001,tom,12
    }

    /**
     * 將javaBean轉化為json物件
     */
    @Test
    public void bean2Json(){
        People people = new People("002","jack",23);
        JSONObject jsonObject = (JSONObject) JSON.toJSON(people);
        System.out.println("bean2Json()方法:jsonObject==" + jsonObject);

        // 輸出結果: bean2Json()方法:jsonObject=={"name":"jack","id":"002","age":23}
    }

    /**
     * 全序列化 直接把java bean序列化為json文字之後,能夠按照原來的型別反序列化回來。支援全序列化,需要開啟SerializerFeature.WriteClassName特性
     */
    @Test
    public void parseJSONAndBeanEachother(){
        People people = new People("002","jack",23);
        SerializerFeature[] featureArr = { SerializerFeature.WriteClassName };
        String text = JSON.toJSONString(people, featureArr);

        System.out.println("parseJSONAndBeanEachother()方法:text==" + text);
        // 輸出結果:parseJSONAndBeanEachother()方法:text=={"@type":"com.wanggs.com.wanggs.json.fastjson.People","age":23,"id":"002","name":"jack"}
      People people1 = (People) JSON.parse(text);
        System.out.println("parseJSONAndBeanEachother()方法:People==" + people1.getId() + "," + people1.getName() + "," + people1.getAge());
        // 輸出結果:userObj==testFastJson001,maks,105
    }

}
附:javaBean類People.java
package com.wanggs.com.wanggs.json.fastjson;

/**
 * Created by wanggs on 2017/7/27.
 */
public class People {
    private String id;
    private String name;
    private int age;

    public People() {
    }

    public People(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在深入Json

package test.com.wanggs.com.wanggs.json.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.wanggs.com.wanggs.json.fastjson.Address;
import com.wanggs.com.wanggs.json.fastjson.People;
import org.junit.Test;

import java.util.*;

import static org.junit.Assert.*;

/**
 * Created by wanggs on 2017/7/27.
 */
public class FastJsonTest1Test {
    /**
     * 陣列轉json字串
     */
    @Test
    public void array2Json() {
        String[] arr = {"bill", "green", "maks", "jim"};
        String jsonText = JSON.toJSONString(arr);
        System.out.println("array2Json()方法:jsonText==" + jsonText);
        // 輸出結果:jsonText==["bill","green","maks","jim"]
    }

    /**
     * json格式字串轉陣列
     */
    @Test
    public void json2Array() {
        String jsonText = "[\"bill\",\"green\",\"maks\",\"jim\"]";
        JSONArray jsonArray = JSON.parseArray(jsonText);
        System.out.println("json2Array()方法:jsonArray==" + jsonArray);
        // 輸出結果:jsonArray==["bill","green","maks","jim"]
    }

    /**
     * 陣列轉json格式字串
     */
    @Test
    public void array2Json2() {
        People people = new People("001", "tom", 12);
        People people1 = new People("002", "jack", 23);
        People people2 = new People("003", "mair", 22);

        People[] peoples = new People[]{people, people1, people2};

        String jsonText = JSON.toJSONString(peoples);
        System.out.println("array2Json2()方法:jsonText==" + jsonText);

        //輸出結果:array2Json2()方法:jsonText==[{"age":12,"id":"001","name":"tom"},{"age":23,"id":"002","name":"jack"},{"age":22,"id":"003","name":"mair"}]

    }

    /**
     * json格式字串轉陣列
     */
    @Test
    public void json2Array2() {
        String jsonText = "[{\"age\":12,\"id\":\"001\",\"name\":\"tom\"},{\"age\":23,\"id\":\"002\",\"name\":\"jack\"},{\"age\":22,\"id\":\"003\",\"name\":\"mair\"}]";
        JSONArray jsonArr = JSON.parseArray(jsonText);
        System.out.println("json2Array2()方法:jsonArr==" + jsonArr);
        // 輸出結果:json2Array2()方法:jsonArr==[{"name":"tom","id":"001","age":12},{"name":"jack","id":"002","age":23},{"name":"mair","id":"003","age":22}]

    }

    /**
     * list集合轉json格式字串
     */
    @Test
    public void list2Json() {
        List<People> list = new ArrayList<People>();
        list.add(new People("001", "tom", 12));
        list.add(new People("002", "jack", 23));
        list.add(new People("003", "mair", 22));

        String jsonText = JSON.toJSONString(list);
        System.out.println("list2Json()方法:jsonText==" + jsonText);

        // 輸出的結果為: [{"age":12,"id":"001","name":"tom"},{"age":23,"id":"002","name":"jack"},{"age":22,"id":"003","name":"mair"}]
    }


    /**
     * map轉json格式字串
     */
    @Test
    public void map2Json() {
        Map map = new HashMap();
        Address address1 = new Address("廣東省","深圳市","科苑南路","580053");
        map.put("address1", address1);
        Address address2 = new Address("江西省","南昌市","陽明路","330004");
        map.put("address2", address2);
        Address address3 = new Address("陝西省","西安市","長安南路","710114");
        map.put("address3", address3);
        String jsonText = JSON.toJSONString(map, true);
        System.out.println("map2Json()方法:jsonText=="+jsonText);
        //輸出結果:jsonText=={"address1":{"city":"深圳市","post":"580053","province":"廣東省","street":"科苑南路"},"address2":{"city":"南昌市","post":"330004","province":"江西省","street":"陽明路"},"address3":{"city":"西安市","post":"710114","province":"陝西省","street":"長安南路"}}
    }

    /**
     * json轉map
     */
    @Test
    public void json2Map(){
        String text = "{\"age\":12,\"id\":\"001\",\"name\":\"tom\"}";
        Map<String,Object> map = JSON.parseObject(text);
        System.out.println("json2Map()方法:map=="+map);
        //輸出結果:{"name":"tom","id":"001","age":12}
        Set<String> set = map.keySet();
        for(String key : set){
            System.out.println(key+"--->"+map.get(key));
        }
    }
}

技巧

package com.wanggs.com.wanggs.json.fastjson;

import com.alibaba.fastjson.JSON;

/**
 * Created by wanggs on 2017/7/27.
 */
public class CustomText {

    /**
     * touser : OPENID
     * msgtype : text
     * text : {"content":"Hello World"}
     */
//{"msgtype":"text","text":{"content":"Hello World"},"touser":"OPENID"}
    private String touser;
    private String msgtype;
    private TextBean text;

    public static class TextBean {
        /**
         * content : Hello World
         */

        private String content;

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }
    }
    public String getTouser() {
        return touser;
    }

    public void setTouser(String touser) {
        this.touser = touser;
    }

    public String getMsgtype() {
        return msgtype;
    }

    public void setMsgtype(String msgtype) {
        this.msgtype = msgtype;
    }

    public TextBean getText() {
        return text;
    }

    public void setText(TextBean text) {
        this.text = text;
    }
}

class Test{
    public static void main(String[] args) {
        CustomText customText = new CustomText();
        customText.setTouser("OPENID");
        customText.setMsgtype("text");
        CustomText.TextBean textBean =  new CustomText.TextBean();
        textBean.setContent("Hello World");
        customText.setText(textBean);

        String json = JSON.toJSONString(customText);
        System.out.println(json);
        //{"msgtype":"text","text":{"content":"Hello World"},"touser":"OPENID"}
    }
    /**
     * {
     "touser":"OPENID",
     "msgtype":"text",
     "text":
     {
     "content":"Hello World"
     }
     }
     */
    }


歸納六種方式json轉map

package com.wanggs.com.wanggs.json.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.util.Map;
import java.util.Set;

/**
 * Created by wanggs on 2017/7/27.
 */
public class FastJsonTest1 {
    public static void main(String[] args) {
        String str = "{\"0\":\"zhangsan\",\"1\":\"lisi\",\"2\":\"wangwu\",\"3\":\"maliu\"}";
        //第一種方式
        Map maps = (Map)JSON.parse(str);
        System.out.println("這個是用JSON類來解析JSON字串!!!");
        for (Object map : maps.entrySet()){
            System.out.println(((Map.Entry)map).getKey()+"     " + ((Map.Entry)map).getValue());
        }
        //第二種方式
        Map mapTypes = JSON.parseObject(str);
        System.out.println("這個是用JSON類的parseObject來解析JSON字串!!!");
        for (Object obj : mapTypes.keySet()){
            System.out.println("key為:"+obj+"值為:"+mapTypes.get(obj));
        }
        //第三種方式
        Map mapType = JSON.parseObject(str,Map.class);
        System.out.println("這個是用JSON類,指定解析型別,來解析JSON字串!!!");
        for (Object obj : mapType.keySet()){
            System.out.println("key為:"+obj+"值為:"+mapType.get(obj));
        }
        //第四種方式
        /**
         * JSONObject是Map介面的一個實現類
         */
        Map json = (Map) JSONObject.parse(str);
        System.out.println("這個是用JSONObject類的parse方法來解析JSON字串!!!");
        for (Object map : json.entrySet()){
            System.out.println(((Map.Entry)map).getKey()+"  "+((Map.Entry)map).getValue());
        }
        //第五種方式
        /**
         * JSONObject是Map介面的一個實現類
         */
        JSONObject jsonObject = JSONObject.parseObject(str);
        System.out.println("這個是用JSONObject的parseObject方法來解析JSON字串!!!");
        for (Object map : json.entrySet()){
            System.out.println(((Map.Entry)map).getKey()+"  "+((Map.Entry)map).getValue());
        }
        //第六種方式
        /**
         * JSONObject是Map介面的一個實現類
         */
        Map mapObj = JSONObject.parseObject(str,Map.class);
        System.out.println("這個是用JSONObject的parseObject方法並執行返回型別來解析JSON字串!!!");
        for (Object map: json.entrySet()){
            System.out.println(((Map.Entry)map).getKey()+"  "+((Map.Entry)map).getValue());
        }
        String strArr = "{{\"0\":\"zhangsan\",\"1\":\"lisi\",\"2\":\"wangwu\",\"3\":\"maliu\"}," +
                "{\"00\":\"zhangsan\",\"11\":\"lisi\",\"22\":\"wangwu\",\"33\":\"maliu\"}}";
        // JSONArray.parse()
        System.out.println(json);
    }
}
package com.wanggs.com.wanggs.json.fastjson;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.*;

/**
 * Created by wanggs on 2017/7/27.
 */
public class FastJsonTest {
    public static void main(String[] args) {

        String json = "[{\"id\":1,\"type\":\"cycle\",\"attribute\":{\"center\":\"(10.4, 123.345)\", \"radius\":67.4}},{\"id\":2,\"type\":\"polygon\",\"attribute\":[{\"vertex\":\"(10.4, 133.345)\"}, {\"vertex\":\"(10.4, 143.345)\"}]}]";

        JSONArray array = JSON.parseArray(json);

        System.out.println(array.getJSONObject(0).getJSONObject("attribute").get("center"));

        System.out.println(array.getJSONObject(1).getJSONArray("attribute").getJSONObject(1).get("vertex"));

       // 輸出結果為: (10.4, 123.345) (10.4, 143.345)
    }
}

方法總結

4.JSONObject、JSONArray,Map轉String
JSONObject——String:
System.out.println(myJsonObject);//可直接輸出JSONObject的內容
myJsonObject.toString();
JSONArray——String:
System.out.println(myJsonArray);//可直接輸出myJsonArray的內容
myJsonArray.toString();
Map——String:
System.out.println(map);//可直接輸出map的內容
map.toString();

5.JSONObject轉JSONArray

JSONObject myJson = JSONObject.fromObject(jsonString);

Map m = myJson;

7.JSONArray轉JSONObject
for(int i=0 ; i < myJsonArray.length() ;i++)
{
//獲取每一個JsonObject物件
JSONObject myjObject = myJsonArray.getJSONObject(i);

}

8.JSONArray轉Map

9.Map轉JSONObject
JSONObject json = JSONObject.fromObject( map );

10.Map轉JSONArray
JSONArray.fromObject(map);

11.List轉JSONArray
JSONArray jsonArray2 = JSONArray.fromObject( list );