fastjson使用心得

时间:2024-10-14 13:59:39

        喜欢fastjson,因为只需要依赖JDK,其他环境都不需要依赖就可以使用。而且它非常的快。这里我也把使用它的一些感悟和总结写出来,供大家指正。

        说到fastjson,我们就要懂得一个概念就是序列化:将对象信息转换为可以传输和存储的信息【百度百科】

        我们不需要一个字段的时候我们可以通过@JSONFiled(serialize=false) 来不序列化,默认JSONFiled类里面serialize和deserialize都是true

        @JSONFiled()里面有很多参数可以去设置,比如时间的类型@JSONFiled(format="yyyyMMdd HHmmss"),也可以指定在序列化时的名字。

  1. @Id
  2. @Column(name = "id")
  3. @JSONField(name = "ID")
  4. @GeneratedValue(strategy= )
  5. public int getId() {
  6. return id;
  7. }
       比如我们在上面指定序列化后名字为“ID”。

      

      fastjson还有一个优点就是和java中的实体类有很好的融合。我们定义好的实体类。然后我们在返回给前端使用的时候,有一些字段我们是不需要或者前端不要求提供的。所以我们可以用过滤器把它过滤掉。

   SimplePropertyPreFilter filter = new SimplePropertyPreFilter(,"ID","contractContent","fixtureTime","contractContent","typeName","dealMark","transactionAmount");
   return  (new BaseModel(Constants.SUCCESS_CODE,fundLists2),filter);
      这样返回的字段就是我们Filter里面定义的规定字段。

      当我们按顺序输出相关的列,我们可以在输出的model类中加入注解@JSONField(ordinal=0) ..  如下:

  1. @JSONField(ordinal = 0)
  2. private String code;
  3. @JSONField(ordinal = 1)
  4. private Map<String,String> myGroup;
  5. @JSONField(ordinal = 2)
  6. private Map<String,String> addGroup;

      另外我们在持有对象的时候需要返回相关信息,就会解析错误,比如解析成$ref这样的对象类型,我们就可以在解析的时候做一些处理(加了红色的标注部分),如下:

   return (new BaseModel(Constants.SUCCESS_CODE,resultList),filter,<strong><span style="color:#ff0000;"></span></strong>);

     还有一些不经常使用的类库,其实功能还是比较强大,JSONPath

  1. package ;
  2. import ;
  3. import ;
  4. import ;
  5. import ;
  6. public class JSONPathTest {
  7. public static void main(String[] args) {
  8. List<MyEntity> entities = new ArrayList<MyEntity>();
  9. (new MyEntity(1001, "ljw1001"));
  10. (new MyEntity(1002, "yan1002"));
  11. (new MyEntity(1003, "asw1003"));
  12. (new MyEntity(1004, null));
  13. /**
  14. * 把fastjson当查询来用,不知道这种效率怎么样,比起ID查询来看
  15. * [id in (1001,1003)] 按特定ID来筛选集合中的元素
  16. * [0,2] 按下标来筛选集合中的元素,返回下标中0和2的元素
  17. * [0:2] 按下标来筛选集合中的元素,返回下标中0-2的元素
  18. * $.name 返回MyEntity中所有的name
  19. *
  20. */
  21. List<MyEntity> result = (List<MyEntity>)(entities, "[id in (1001,1003)]");
  22. List<MyEntity> result1 = (List<MyEntity>)(entities, "[0,2]");
  23. List<MyEntity> result2 = (List<MyEntity>)(entities, "[0:2]");
  24. List<MyEntity> result3 = (List<MyEntity>)(entities, "$.name");
  25. MyEntity myEntity = (0);
  26. //(result3);
  27. MyEntity myEntity2 = new MyEntity(1005,"asd1005","String Object");
  28. String value = (String)(myEntity2, "$.value");
  29. (value);
  30. //是否有value元素
  31. boolean isContain = (myEntity2, "$.value", ());
  32. (isContain);
  33. int size = (myEntity2, "$");
  34. (size);
  35. }
  36. }
  37. class MyEntity{
  38. private int id;
  39. private String name;
  40. private Object value;
  41. public MyEntity(){
  42. }
  43. public MyEntity(int id,String name){
  44. this.id = id;
  45. this.name = name;
  46. }
  47. public MyEntity(int id,String name,Object value){
  48. this(id,name);
  49. this.value = value;
  50. }
  51. @Override
  52. public String toString() {
  53. return "MyEntity [hljs-string">", name=" + name + "]";
  54. }
  55. //getter and setter
  56. }
        ParseProcess的用法:

  1. package ;
  2. import ;
  3. import ;
  4. import ;
  5. import ;
  6. import ;
  7. import ;
  8. public class VO {
  9. private int id;
  10. private Map<String, Object> attributes = new HashMap<String, Object>();
  11. public int getId() { return id; }
  12. public void setId(int id) { this.id = id;}
  13. public Map<String, Object> getAttributes() { return attributes;}
  14. public static void main(String[] args) {
  15. ExtraProcessor processor = new MyExtraProcessor();
  16. VO vo = ("{\"id\":123,\"value\":\"123456\"}", , processor);
  17. (());
  18. //value被强行转成了Integer类型了
  19. (().get("value"));
  20. }
  21. }
  22. class MyExtraProcessor implements ExtraProcessor, ExtraTypeProvider {
  23. public void processExtra(Object object, String key, Object value) {
  24. VO vo = (VO) object;
  25. ().put(key, value);
  26. }
  27. public Type getExtraType(Object object, String key) {
  28. if ("value".equals(key)) {
  29. return int.class;
  30. }
  31. return null;
  32. }
  33. };

     提取JSON字符串里面的集合对象

        当然我们也可以使用fastJson 来解析JSON字符串,比如我们有如下的JSON串。

  1. {
  2. "code": "00",
  3. "t": [
  4. {
  5. "chargeFree": 0,
  6. "date": "12-03 19:12",
  7. "showProdKeyName": "欧元/美元",
  8. "userImg": "http://116.31.94.164:8090/market-master-gateway/resources/images/upload",
  9. "verifyFlg": 0,
  10. "praiseCount": 0,
  11. "readCount": 0,
  12. "ifForward": 0,
  13. "points": 50,
  14. "ifSuccess": 0,
  15. "targetPrice": "1.0624"}
  16. ]
  17. }

      我们想解析把 t 解析成一个对象,使用如下的方式:

  1. JSONObject jsonObject = (str);
  2. String data = ("t").toString();
  3. List<ViewPointEntity> lists = (data,);

当然省略一下中间的步骤也是可以的,可以用下面更好的方式:

        List<ViewPointEntity> lists = (List<ViewPointEntity>)((str).get(t));

     提取json,直接封装成对象

       例如json对象是如下格式:

  1. {
  2. "ID": 515697,
  3. "chargeFree": 0,
  4. "commentCount": 0,
  5. "confidence": "30"
  6. }

       可以通过下面的代码进行字符串转成对象操作:

    ViewPointEntity viewpoint = (msg,);



     就可以把上面的 t 转换成一个List了,然后就可以操作啦

     另外我们可以让Chrome浏览器加载一个JSON的识别插件   项目地址:/gildas-lormeau/JSONView-for-Chrome  , 下载好后解压,加载已解压的程序的时候定位到WebContent 就可以了。