简介

  • 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是否为nullObject o = get( key ); //获取key对应的值,不知道是什么类型,所以用Object接收//如果值不为nullif( 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() {@Overridepublic 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}
    

    }

  • 参考文章