总论
就是非常快的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;
}