前言:
关于Fastjson的API网上一搜一大把,本人自己写这个的目的主要是为了记录学习,便于自己查阅,也给对Fastjson刚接触的同学提供一点点参考,如果能帮助到你那就更好了,我也会非常开心。下边的几个常用方法都是根据自己工作中常用到的做个整理,之后会随着工作用到的越来越多逐渐添加。如果有写的不准确的欢迎指正,在此感谢。
常用API
/**
* 1、public static final Object parse(String text); //String转JSONObject、JSONAray
* 2、public static final JSONObject parseObject(String text);//String转 JSONObject
* 3、public static final <T> T parseObject(String text, Class<T> clazz); //JSON字符串转为Bean
* 4、public static final JSONArray parseArray(String text); //JSON字符串转为JSONarray
* 5、public static final <T> List<T> parseArray(String text, Class<T> clazz); //JSON字符串转JAVA Bean集合
* 6、public static final String toJSONString(Object object); //JAVA Bean转为JSON字符串
* 7、public static final String toJSONString(Object object, boolean prettyFormat); //将JAVA Bean转为字符串,可以选择是否按照格式输出
* 8、public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray
*/
- [1] public static final Object parse(String text) //String转JSONObject、JSONAray
这个方法的主要作用是将json格式的字符串转为JSONObject或者JSONArray,其中有个需要注意的地方:
(1)如果你的String格式为JSONObject格式,那么可以直接转为JSONObject,而不能强转为JSONArray,编译不会报错,运行会报错java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.alibaba.fastjson.JSONArray
;同样如果String格式为JSONArray格式,那么可以直接转为JSONArray,而不能直接强转JSONObject,同样编译不会报错,而运行会报错java.lang.ClassCastException: com.alibaba.fastjson.JSONArray cannot be cast to com.alibaba.fastjson.JSONObject,下面举例说明。
一个Person类,三个属性,姓名、年龄、银行卡,get、set方法什么的就不详细写了。
第一种String,JSONObject类型:public class Person { private String name; private int age; private List<String> IdCard; }
{
"name": "James",
"age": 35,
"idCard": [
"123456",
"3455678",
"567780"
]
}
现在把这个字符串转为JSONObject,代码如下:
@Test
public void testStringJsonObject(){
String string_person = "{\n" +
" \"name\": \"James\",\n" +
" \"age\": 18,\n" +
" \"idCard\": [\n" +
" \"123456\",\n" +
" \"3455678\",\n" +
" \"567780\"\n" +
" ]\n" +
"}";
JSONObject jsonObject = (JSONObject) JSON.parse(string_person);
System.out.println(jsonObject);
System.out.println("name :" + jsonObject.get("name"));
System.out.println("age :" + jsonObject.get("age"));
System.out.println("idCard :" + jsonObject.get("idCard"));
}
输出结果如下:
{"idCard":["123456","3455678","567780"],"name":"James","age":18}
name :James
age :18
idCard :["123456","3455678","567780"]
如果我把转换类型换一下,转为JSONArray,
JSONArray jsonArray = (JSONArray) JSON.parse(string_person);
System.out.println(jsonArray);
第二种String,JSONArrayt类型:
[
{
"name": "James",
"age": 35,
"idCard": [
"123456",
"3455678",
"567780"
]
},
{
"name": "Jack Ma",
"age": 50,
"idCard": [
"5756756",
"9808989",
"5867657"
]
}
]
把这个字符串转为JSONArray,代码如下:
@Test
public void testStringJsonArray(){
String array_person = "[\n" +
" {\n" +
" \"name\": \"James\",\n" +
" \"age\": 35,\n" +
" \"idCard\": [\n" +
" \"123456\",\n" +
" \"3455678\",\n" +
" \"567780\"\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"name\": \"Jack Ma\",\n" +
" \"age\": 50,\n" +
" \"idCard\": [\n" +
" \"5756756\",\n" +
" \"9808989\",\n" +
" \"5867657\"\n" +
" ]\n" +
" }\n" +
"]";
JSONArray jsonArray = (JSONArray) JSON.parse(array_person);
System.out.println(jsonArray);
for (int i = 0; i <jsonArray.size() ; i++) {
System.out.println(jsonArray.get(i));
}
}
我们可以向遍历数组一样,按照索引去遍历JSONArray,输出如下:
`[{“idCard”:[“123456”,“3455678”,“567780”],“name”:“James”,“age”:35},{“idCard”:[“5756756”,“9808989”,“5867657”],“name”:“Jack Ma”,“age”:50}]
{“idCard”:[“123456”,“3455678”,“567780”],“name”:“James”,“age”:35}
{“idCard”:[“5756756”,“9808989”,“5867657”],“name”:“Jack Ma”,“age”:50}
` *
如果把这种类型的强转为JSONObject就会报异常:
所以这个方法在应用是还是要注意区分String的格式,JSONObject格式,外围是花括号,JSONArray格式,外围是方括号。
[2] public static final JSONObject parseObject(String text);//String转 JSONObject
这个方式作用是将字符串转为JSONObject,注意点和方法一一样,注意字符串的格式,应该为JSONObject格式的字符串,否则会报转换异常。
- [3] public static final T parseObject(String text, Class clazz); //JSON字符串转为Bean
@Test
//public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
public void parseObject(){
String string_person = "{\n" +
" \"name\": \"James\",\n" +
" \"age\": 18,\n" +
" \"idCard\": [\n" +
" \"123456\",\n" +
" \"3455678\",\n" +
" \"567780\"\n" +
" ]\n" +
"}";
Person person = JSON.parseObject(string_person, Person.class);
System.out.println(person.toString());
}
Person[name='James', age=18, IdCard=[123456, 3455678, 567780]]
注意文本的格式,如果是JSONArray格式的,可以先转为JSONArray,再转为JSONObject,再转为JavaBean。直接转会报转换异常;
- [4]public static final JSONArray parseArray(String text); //JSON字符串转为JSONarray
- 和第三个方法差不多,使用的时候注意文本格式
JSONArray jsonArray = JSON.parseArray(array_person);
System.out.println(jsonArray);
[{"idCard":["123456","3455678","567780"],"name":"James","age":35},{"idCard":["5756756","9808989","5867657"],"name":"Jack Ma","age":50}]
- [5] public static final List parseArray(String text, Class clazz); //JSON字符串转JAVA Bean集合
List<Person> personList = JSON.parseArray(array_person, Person.class);
System.out.println(personList.get(0));
System.out.println(personList.get(1));
输出如下
Person[name='James', age=35, IdCard=[123456, 3455678, 567780]]
Person[name='Jack Ma', age=50, IdCard=[5756756, 9808989, 5867657]]
- [6] public static final String toJSONString(Object object); //JAVA Bean转为JSON字符串
代码片段:
String string = JSON.toJSONString(p1);
System.out.println("JSON to String :" + string);
输出如下:
JSON to String :{"age":35,"idCard":["123456","3455678","567780"],"name":"James"}
- [7] public static final String toJSONString(Object object, boolean prettyFormat); //将JAVA Bean转为字符串,可以选择是否按照格式输出
String string1 = JSON.toJSONString(p1, true);
System.out.println(string1);
String string2 = JSON.toJSONString(p1, false);
System.out.println(string2);
输出如下:
{
"age":35,
"idCard":[
"123456",
"3455678",
"567780"
],
"name":"James"
}
{"age":35,"idCard":["123456","3455678","567780"],"name":"James"}
第一个输出,按照格式,第二个不按照格式。
- [8] public static final Object toJSON(Object javaObject); //将JavaBean转换为JSONObject或者JSONArray,使用的时候注意强制类型转换。
JSONObject jsonObject = (JSONObject) JSON.toJSON(p1);
System.out.println(jsonObject);
输出如下:
{"idCard":["123456","3455678","567780"],"name":"James","age":35}
而在转数组的时候,我自己实验会报错
JSONArray jsonArray1 = (JSONArray) JSON.toJSON(p1);
System.out.println(jsonArray1);
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.alibaba.fastjson.JSONArray
但是如果p1是一个list类型,就不会报错。如果p1就是一个对象,而不是对象列表,有一种方式也可以转为JSONArray,可以先转为JSONObject,在转为JSONArray,代码如下:
JSONObject jsonObject = (JSONObject) JSON.toJSON(p1);
JSONArray jsonArray = new JSONArray();
jsonArray.add(jsonObject);
System.out.println(jsonArray);
输出结果如下,注意花括号变为了方括号,变为了数组类型:
[{"idCard":["123456","3455678","567780"],"name":"James","age":35}]
总之使用方式非常多,大家可以按照自己的习惯选择。虽然FastJson暴了一些BUG,但这在软件领域我感觉是很正常的,没有完美的工具,出了BUG解决就好了,现在仍然有很多公司,无论是大公司还是小公司仍然在用FastJson,越早爆出BUG越早解决,未尝不是好事啊!