简介
- 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}
}
- 参考文章