简介
- fastjson是一个java编写的JSON处理器
依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.31</version> </dependency>
常用的方法都是静态方法
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合 public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本(即json格式的String) public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。
- JSONObject:就是常说的json,是一种重要的数据传输对象。
- JSONObject可以转为Object,但是Object却不能转为JSONObject,只能转为json格式的String类型
- 格式:{“key”:”value”,”key”:”value”};key必须是字符串,value是基本类型的话就不带引号
返回方式:一般是通过response.getWriter()获取PrintWriter printWriter,然后printWriter.print(json),如果没有设置好内容类型:response.setContentType(“application/json;charset=utf-8”);就要自己到js中再进行解析。
response.setContentType("application/json; charset=utf-8"); PrintWriter pw = response.getWriter(); Student s = new Student(。。。);//反正就是构造一个对象,有没有数据无所谓 JSONObjet json = JSONObjet .from(s);//将s转化成json对象。 pw .print(json); pw .flush(); pw .close(); 这样这个json对象就传到你发送请求的那个jsp上面。 而$.post(url,datas.function(data){})这里的data就是后台返回的值,也就是这里的json 只需要 var json = data;//就获取到了。 再取得原来Student的属性 var name = json.name(student 的name 属性);
- JSONArray:由JSONObject构成的数组
- 格式:[{“key”:”value”,”key”:”value”},{“key”:”value”,”key”:”value”}];注意,最外面是中括号而不是花括号
toJSONString()、parseObject()
- JSON.parseObject():将json字符串转为相应的对象
- JSON.toJSONString():将对象转为json字符串,可同时传入一个SerializerFeature对象指定格式
JSONObject.getString(String key):根据key获取对应的值(任何类型都转为String),key不存在时抛NPE;以下为源码
public String getString( String key ) { verifyIsNull(); //应该是判断key是否为null Object o = get( key ); //获取key对应的值,不知道是什么类型,所以用Object接收 //如果值不为null if( o != null ){ return o.toString();//不管什么类型都转为String } //为null则抛异常 throw new JSONException( "JSONObject[" + JSONUtils.quote( key ) + "] not found." ); }
getInt(String key):获取对应值并转为int型,值为int型或“123”这样的字符串都可以,否则抛非数字异常。
public int getInt(String key) { verifyIsNull(); Object o = get(key); if (o != null) { //这里非数字的话会报非数字错误 return o instanceof Number ? ((Number) o).intValue() : (int) getDouble(key); } //无对应值的话 throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number."); }
首先引入fastjson的依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson_version}</version> </dependency>
定义一个实体类
public class Staff { private String name; private Integer age; private String sex; private Date birthday; }
测试两个方法
public class jsonTest { public static void main(String[] args) { /** * json字符串转化为对象 */ String jsonString = "{name:'Antony',age:'12',sex:'male',telephone:'88888'}"; //telephone是Staff没有的属性;另外还差个birthday属性 Staff staff = JSON.parseObject(jsonString, Staff.class); System.out.println(staff.toString()); //Staff{name='Antony', age=12, sex='male', birthday=null} /** * 对象转化为json字符串 */ String jsonStr = JSON.toJSONString(staff); System.out.println(jsonStr); //{"age":12,"name":"Antony","sex":"male"};age是基本类型,无双引号;为null的属性不显示 } }
SerializerFeature类
- 主要用于将fastjson的格式进行调整,如是否要输出为null的字段、Date类型的显示格式等
- 属性
用法:直接加到toJSONString()的参数里就行,不加就用默认值,默认开就是开,不开就是不开
JSON.toJSONString(staff, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteNullListAsEmpty)
- 参考文章:里面有更多属性的用法,靠后的黑图展示了多种属性的输出格式
SerializeConfig类
- 对序列化过程做一些特殊配置,其实也就类似SerializerFeature类的补充
用法
public static SerializeConfig mapping=new SerializeConfig(); mapping.put(Date.class,new SimpleDateFormatSerialzer("yyyy-MM-dd"); JOSN.toJSONString(staff,mapping); //假设staff有日期类属性那将会输出2018-11-3
SerialzeFilter接口
- 对每个属性定制序列化,比如当这个属性大于多少的时候才序列化,否则不用写到json里面了
它有多个子接口
- PropertyPreFilter 根据PropertyName判断是否序列化;
- PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化;
- NameFilter 修改Key,如果需要修改Key,process返回值则可;
- ValueFilter 修改Value;
- BeforeFilter 序列化时在最前添加内容;
- AfterFilter 序列化时在最后添加内容。
PropertyFilter的源码
public interface PropertyFilter extends SerializeFilter { boolean apply(Object object, String propertyName, Object propertyValue); //true则序列化,否则不 }
用法
public static void main(String[] args) { PropertyFilter filter = new PropertyFilter() { @Override public boolean apply(Object source, String name, Object value) { // 属性是id并且大于等于100时进行序列化 if (name.equals("id")) { long id = ((Long) value).longValue(); return id >= 100; } return false; } }; User user = new User(); user.setId(9L); user.setName("挖坑埋你"); String jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter System.out.println("序列化,id=9:" + jsonString + "\n"); // {} user.setId(200L); jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter System.out.println("序列化,id=200:" + jsonString); // {"id":200}
}
- 参考文章