简介

  • fastjson是一个java编写的JSON处理器
  • 依赖

    1. <dependency>
    2. <groupId>com.alibaba</groupId>
    3. <artifactId>fastjson</artifactId>
    4. <version>1.2.31</version>
    5. </dependency>
  • 常用的方法都是静态方法

    1. public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
    2. public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
    3. public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
    4. public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
    5. public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
    6. public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本(即json格式的String
    7. public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
    8. 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中再进行解析。

    1. response.setContentType("application/json; charset=utf-8");
    2. PrintWriter pw = response.getWriter();
    3. Student s = new Student(。。。);//反正就是构造一个对象,有没有数据无所谓
    4. JSONObjet json = JSONObjet .from(s);//将s转化成json对象。
    5. pw .print(json);
    6. pw .flush();
    7. pw .close();
    8. 这样这个json对象就传到你发送请求的那个jsp上面。
    9. 而$.post(url,datas.function(data){})这里的data就是后台返回的值,也就是这里的json
    10. 只需要 var json = data;//就获取到了。
    11. 再取得原来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;以下为源码

    1. public String getString( String key ) {
    2. verifyIsNull(); //应该是判断key是否为null
    3. Object o = get( key ); //获取key对应的值,不知道是什么类型,所以用Object接收
    4. //如果值不为null
    5. if( o != null ){
    6. return o.toString();//不管什么类型都转为String
    7. }
    8. //null则抛异常
    9. throw new JSONException( "JSONObject[" + JSONUtils.quote( key ) + "] not found." );
    10. }
  • getInt(String key):获取对应值并转为int型,值为int型或“123”这样的字符串都可以,否则抛非数字异常。

    1. public int getInt(String key)
    2. {
    3. verifyIsNull();
    4. Object o = get(key);
    5. if (o != null)
    6. {
    7. //这里非数字的话会报非数字错误
    8. return o instanceof Number ? ((Number) o).intValue() : (int) getDouble(key);
    9. }
    10. //无对应值的话
    11. throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");
    12. }
  • 首先引入fastjson的依赖

    1. <dependency>
    2. <groupId>com.alibaba</groupId>
    3. <artifactId>fastjson</artifactId>
    4. <version>${fastjson_version}</version>
    5. </dependency>
  • 定义一个实体类

    1. public class Staff {
    2. private String name;
    3. private Integer age;
    4. private String sex;
    5. private Date birthday;
    6. }
  • 测试两个方法

    1. public class jsonTest {
    2. public static void main(String[] args) {
    3. /**
    4. * json字符串转化为对象
    5. */
    6. String jsonString = "{name:'Antony',age:'12',sex:'male',telephone:'88888'}"; //telephone是Staff没有的属性;另外还差个birthday属性
    7. Staff staff = JSON.parseObject(jsonString, Staff.class);
    8. System.out.println(staff.toString()); //Staff{name='Antony', age=12, sex='male', birthday=null}
    9. /**
    10. * 对象转化为json字符串
    11. */
    12. String jsonStr = JSON.toJSONString(staff);
    13. System.out.println(jsonStr); //{"age":12,"name":"Antony","sex":"male"};age是基本类型,无双引号;为null的属性不显示
    14. }
    15. }

    SerializerFeature类

  • 主要用于将fastjson的格式进行调整,如是否要输出为null的字段、Date类型的显示格式等
  • 属性
  • 用法:直接加到toJSONString()的参数里就行,不加就用默认值,默认开就是开,不开就是不开

    1. JSON.toJSONString(staff, SerializerFeature.PrettyFormat,
    2. SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty,
    3. SerializerFeature.DisableCircularReferenceDetect,
    4. SerializerFeature.WriteNullListAsEmpty)
  • 参考文章:里面有更多属性的用法,靠后的黑图展示了多种属性的输出格式

    SerializeConfig类

  • 对序列化过程做一些特殊配置,其实也就类似SerializerFeature类的补充
  • 用法

    1. public static SerializeConfig mapping=new SerializeConfig();
    2. mapping.put(Date.class,new SimpleDateFormatSerialzer("yyyy-MM-dd");
    3. JOSN.toJSONString(staff,mapping); //假设staff有日期类属性那将会输出2018-11-3

    SerialzeFilter接口

  • 对每个属性定制序列化,比如当这个属性大于多少的时候才序列化,否则不用写到json里面了
  • 它有多个子接口

    • PropertyPreFilter 根据PropertyName判断是否序列化;
    • PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化;
    • NameFilter 修改Key,如果需要修改Key,process返回值则可;
    • ValueFilter 修改Value;
    • BeforeFilter 序列化时在最前添加内容;
    • AfterFilter 序列化时在最后添加内容。
  • PropertyFilter的源码

    1. public interface PropertyFilter extends SerializeFilter {
    2. boolean apply(Object object, String propertyName, Object propertyValue); //true则序列化,否则不
    3. }
  • 用法

    1. public static void main(String[] args) {
    2. PropertyFilter filter = new PropertyFilter() {
    3. @Override
    4. public boolean apply(Object source, String name, Object value) {
    5. // 属性是id并且大于等于100时进行序列化
    6. if (name.equals("id")) {
    7. long id = ((Long) value).longValue();
    8. return id >= 100;
    9. }
    10. return false;
    11. }
    12. };
    13. User user = new User();
    14. user.setId(9L);
    15. user.setName("挖坑埋你");
    16. String jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
    17. System.out.println("序列化,id=9:" + jsonString + "\n"); // {}
    18. user.setId(200L);
    19. jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
    20. System.out.println("序列化,id=200:" + jsonString); // {"id":200}

    }

  • 参考文章