FastJson学习

2,942 阅读3分钟

总论

就是非常快的json库

主要类

JSONObject

我们可以看出实际上就是实现了map接口,所以大部分操作都是对map操作,即大部分方法和map方法一致

对于所有的get操作第二个参数是一个Class类带泛型,所以返回值类型也就确定了

对于生成的键值对顺序,默认为无序的,通过构造参数(boolean ordered)可以该为有序。其底层实现为有序则map参数为LinkedHashMap,

无序则为HashMap(因此没有线程安全性),其传入的大小参数直接反应为map的大小,默认为16。

   private static final long serialVersionUID = 1L;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;
    private final Map<String, Object> map;

    public JSONObject() {
        this(16, false);
    }

    public JSONObject(Map<String, Object> map) {
        if (map == null) {
            throw new IllegalArgumentException("map is null.");
        } else {
            this.map = map;
        }
    }

    public JSONObject(boolean ordered) {
        this(16, ordered);
    }

    public JSONObject(int initialCapacity) {
        this(initialCapacity, false);
    }

    public JSONObject(int initialCapacity, boolean ordered) {
        if (ordered) {
            this.map = new LinkedHashMap(initialCapacity);
        } else {
            this.map = new HashMap(initialCapacity);
        }

    }

主要api

//序列化
String jsonString =JSON.toJSONString(obj);
//反序列化
Type type=JSON.parseObject(String,Type.class);

javabean与json互相转化

Person person = new Person("1","fastjson",1);  
 //这里将javabean转化成json字符串  
 String jsonString = JSON.toJSONString(person);  
 System.out.println(jsonString);  
 //这里将json字符串转化成javabean对象,  
person =JSON.parseObject(jsonString,Person.class);  
System.out.println(person.toString());  
//若对应属性为null则转化的json中对应属性也是null

list与json互相转换

Person person1 = new Person("1","fastjson1",1);  
Person person2 = new Person("2","fastjson2",2);  
List<Person> persons = new ArrayList<Person>();  
persons.add(person1);  
persons.add(person2);  
String jsonString = JSON.toJSONString(persons);  
System.out.println("json字符串:"+jsonString);  
          
//解析json字符串  
List<Person> persons2 = JSON.parseArray(jsonString,Person.class);  
//输出解析后的person对象,也可以通过调试模式查看persons2的结构  
System.out.println("person1对象:"+persons2.get(0).toString());  
System.out.println("person2对象:"+persons2.get(1).toString()); 

JSON格式字符串与简单对象型转换

//JSON字符串是否被压缩与结果无关
String json="{\n" +
             "    \"name\": \"BeJson\",\n" +
             "    \"url\": \"http://www.bejson.com\",\n" +
             "    \"page\": 88\n" +
             "}";
        JSONObject jsonObject=JSONObject.parseObject(json);
        System.out.println("name:"+jsonObject.getString("name")+"\n"+"url:"+jsonObject.getString("url")
        +"\n"+"page:"+jsonObject.getString("page"));
        System.out.println(jsonObject.getString("page").getClass());
        System.out.println(jsonObject.getInteger("page").getClass());
//控制台结果
//name:BeJson
//url:http://www.bejson.com
//page:88
//class java.lang.String
//class java.lang.Integer
//由此可见get**()方法返回值和**有关

复杂JSON格式字符串的转换

String json="{\"name\":\"BeJson\",\"url\":\"http://www.bejson.com\",\"page\":88,\"isNonProfit\":true,\"address\":{\"street\":\"科技园路.\",\"city\":\"江苏苏州\",\"country\":\"中国\"},\"links\":[{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.baidu.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.SoSo.com\"}]}";
        JSONObject links = (JSONObject)                      JSONObject.parseObject(json)
            .getJSONArray("links")
            .get(1);
    System.out.println(links.getString("name"));
//因为getJSONArray返回值为JSONObject对象然后调用get()方法得到的是Object对象所以要强制类型转换

在json里面添加一个键值

put()方法
 public Object put(String key, Object value) {
        return this.map.put(key, value);
    }
JSONObject jsonObject=new JSONObject(true);
jsonObject.put("message", "success");
jsonObject.put("loginUser", new LoginUser("ad", "sda", "ads"));       System.out.println(jsonObject.toJSONString());
//如果传入的对象的get方法返回值和对应属性类型不一致则会抛
//出com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.58, class com.example.demo.entity.LoginUser, fieldName : loginUser错误
//这个错误是我属性为Integer返回值为int发现的
//不过现在getset方法都是生成的,还是在修改某一属性的时候重新生成吧,或者直接@Data(lombok)算了
fluentPut()方法

可以连续添加

public JSONObject fluentPut(String key, Object value) {
        this.map.put(key, value);
        return this;
    }

putAll()方法
  public void putAll(Map<? extends String, ? extends Object> m) {
        this.map.putAll(m);
    }
fluentPutAll()方法
 public JSONObject fluentPutAll(Map<? extends String, ? extends Object> m) {
        this.map.putAll(m);
        return this;
    }