简介

  • 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}
    

    }

  • 参考文章