FastJSON个性化序列化

简介:

FastJSON个性化序列化



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
public  class  JstJobGoods  implements  Serializable {
     @JSONField (serialize =  false )
     private  Long id;           //ID
     @JSONField (name =  "shop_id" )
     private  String shopId;           //店铺编号
     @JSONField (name =  "i_id" )
     private  Long iId;           //商品款号,商品ID
     @JSONField (name =  "shop_i_id" )
     private  String shopIId;           //外部款号
     @JSONField (name =  "name" )
     private  String name;           //名称
     @JSONField (name =  "sale_price" )
     private  Long salePrice;           //销售价格
     @JSONField (name =  "enabled" )
     private  Integer enabled;           //是否启用
     @JSONField (name =  "brand_name" )
     private  String brandName;           //品牌名称
     @JSONField (name =  "market_price" )
     private  Long marketPrice;           //市场价格
     @JSONField (serialize =  false )
     private  int  realSkuQt =  0 ;           //真实SKU数量
     @JSONField (serialize =  false )
     private  String digit;           //数据MD5(不含id和uptime计算所得)
     @JSONField (serialize =  false )
     private  java.util.Date uptime;           //更新时间
 
     @JSONField (name =  "skus" )
     private  List<JstJobGoodsSku> goodsSkuList;
 
     @JSONField (serialize =  false )
     private  Opt opt = Opt.DO_NOTHING;
 
     private  static  Pattern pnv = Pattern.compile( "(.+):(.+)" );
     public  static  SerializeFilter[] serializeFilters =  new  SerializeFilter[]{
             new  ValueFilter() {
                 @Override
                 public  Object process(Object object, String name, Object value) {
                     if  (object  instanceof  JstJobGoods) {
                         JstJobGoods goods = (JstJobGoods) object;
                         if  (name.equals( "sale_price" ))
                             return  numberFormat2(( long ) value /  100 );
                         if  (name.equals( "market_price" ))
                             return  numberFormat2(( long ) value /  100 );
                     else  if  (object  instanceof  JstJobGoodsSku) {
                         JstJobGoodsSku sku = (JstJobGoodsSku) object;
                         if  (name.equals( "sale_price" ))
                             return  numberFormat2(( long ) value /  100 );
                         if  (name.equals( "market_price" ))
                             return  numberFormat2(( long ) value /  100 );
                     }
                     return  value;
                 }
             },
             new  BeforeFilter() {
                 @Override
                 public  void  writeBefore(Object object) {
                     //尺码:22,颜色:黑色
                     if  (object  instanceof  JstJobGoods) {
                         JstJobGoods goods = (JstJobGoods) object;
                         goods.setDigit(goods.getDigit());
                     else  if  (object  instanceof  JstJobGoodsSku) {
                         JstJobGoodsSku sku = (JstJobGoodsSku) object;
                         sku.setDigit(sku.getDigit());
                         String properties = sku.getProperties();
                         if  (properties ==  null  || properties.trim().length() ==  0 return ;
                         String[] nvs = properties.split( "," );
                         StringBuffer propertiesNames =  new  StringBuffer();
                         StringBuffer propertiesValues =  new  StringBuffer();
                         for  (String nv : nvs) {
                             Matcher m = pnv.matcher(nv);
                             if  (m.find()) {
                                 propertiesNames.append(m.group( 1 ).trim()).append( ',' );
                                 propertiesValues.append(m.group( 2 ).trim()).append( ',' );
                             }
                         }
                         wipeEndSeparator(propertiesNames,  ',' );
                         wipeEndSeparator(propertiesValues,  ',' );
                         sku.setPropertiesName(propertiesNames.toString());
                         sku.setPropertiesValue(propertiesValues.toString());
                     }
                 }
 
                 private  void  wipeEndSeparator(StringBuffer sb,  char  separator) {
                     if  (sb.length() >  0  && sb.charAt(sb.length() -  1 ) == separator)
                         sb.deleteCharAt(sb.length() -  1 );
                 }
             }
     };
     
     
     //getter and setter...
1
2
3
4
5
6
7
8
public  static  Double numberFormat2( double  value) {
     DecimalFormat df =  new  DecimalFormat( "0.00" );
     df.setRoundingMode(RoundingMode.DOWN);
     return  Double.parseDouble(df.format(value));
}
 
 
String req = JSON.toJSONString(needSynGoodsList, JstJobGoods.serializeFilters, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[
     {
         "brand_name" : "" ,
         "enabled" :1,
         "i_id" :1174,
         "market_price" :188.0,
         "name" : "皮豆豆6620真皮战斗短靴大棉" ,
         "sale_price" :158.0,
         "shop_i_id" : "1174_001" ,
         "shop_id" : "10039844" ,
         "skus" :[
             {
                 "brand_name" : "" ,
                 "color" : "" ,
                 "enabled" :1,
                 "market_price" :188.0,
                 "name" : "皮豆豆6620真皮战斗短靴大棉" ,
                 "pic" : "" ,
                 "pic_big" : "" ,
                 "properties_name" : "尺码,颜色" ,
                 "properties_value" : "21,红色" ,
                 "sale_price" :158.0,
                 "shop_sku_id" : "v_1572_001" ,
                 "sku_id" : "r_1572"
             },
             {
                 "brand_name" : "" ,
                 "color" : "" ,
                 "enabled" :1,
                 "market_price" :188.0,
                 "name" : "皮豆豆6620真皮战斗短靴大棉" ,
                 "pic" : "" ,
                 "pic_big" : "" ,
                 "properties_name" : "尺码,颜色" ,
                 "properties_value" : "21,黑色" ,
                 "sale_price" :158.0,
                 "shop_sku_id" : "v_1573_001" ,
                 "sku_id" : "r_1573"
             }
         ]
     }
]
 
 
{ "code" :0, "issuccess" : true , "msg" : null }


再给个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import  com.alibaba.fastjson.JSON;
import  com.alibaba.fastjson.annotation.JSONField;
import  com.alibaba.fastjson.serializer.AfterFilter;
import  com.alibaba.fastjson.serializer.BeforeFilter;
import  com.alibaba.fastjson.serializer.SerializeFilter;
import  com.alibaba.fastjson.serializer.ValueFilter;
 
import  java.util.ArrayList;
import  java.util.List;
 
 
public  class  FastJSONTest {
     public  static  void  main(String[] args) {
         Foo f0 =  new  Foo( "asan" 1100 , 24 );
         System.out.println( "原始的Foo:\n" +f0);
         String json1 = JSON.toJSONString(f0,  new  ValueFilter() {
             @Override
             public  Object process(Object object, String name, Object value) {
                 switch  (name){
                     case  "_val" return  (Integer) value /  10 ;
                     case  "age" return  (Integer) value + 1 ;
                     default return  value;
                 }
             }
         });
         System.out.println( "第1次序列化后的Foo:\n" +f0);
         System.out.println( ">>>JSON1" +json1);
 
 
         List  list =  new  ArrayList();
         list.add(f0);
         String json2 = JSON.toJSONString(f0, new  SerializeFilter[]{
                 new  BeforeFilter() {
                     @Override
                     public  void  writeBefore(Object object) {
                         if (!(object  instanceof  Foo)) return ;
                         Foo f = (Foo)object;
                         f.setName(f.getName()+ "++" );
                         f.setAge(f.getAge()+ 100 );
                     }
                 },
                 new  AfterFilter() {
                     @Override
                     public  void  writeAfter(Object object) {
//                        if(!(object instanceof Foo))return;
//                        Foo f = (Foo)object;
//                        f.setName(f.getName().substring(0,f.getName().length()-2));
//                        f.setAge(f.getAge()-100);
                     }
                 }
         });
         System.out.println( "第2次序列化后的Foo:\n" +f0);
 
         System.out.println( ">>>JSON2" +json2);
     }
 
}
 
class  Foo {
     private  String name;
     @JSONField (name =  "_val" ,serialize =  true )
     private  int  val;
     private  int  age;
 
     public  Foo(String name,  int  val,  int  age) {
         this .name = name;
         this .val = val;
         this .age = age;
     }
 
     public  String getName() {
         return  name;
     }
 
     public  void  setName(String name) {
         this .name = name;
     }
 
     public  int  getVal() {
         return  val;
     }
 
     public  void  setVal( int  val) {
         this .val = val;
     }
 
     public  int  getAge() {
         return  age;
     }
 
     public  void  setAge( int  age) {
         this .age = age;
     }
 
     @Override
     public  String toString() {
         return  "Foo{"  +
                 "name='"  + name + '\ ''  +
                 ", val="  + val +
                 ", age="  + age +
                 '}' ;
     }
}
1
2
3
4
5
6
7
8
9
10
原始的Foo:
Foo{name= 'asan' , val=1100, age=24}
第1次序列化后的Foo:
Foo{name= 'asan' , val=1100, age=24}
>>>JSON1{ "_val" :110, "age" :25, "name" : "asan" }
第2次序列化后的Foo:
Foo{name= 'asan++' , val=1100, age=124}
>>>JSON2{ "_val" :1100, "age" :124, "name" : "asan++" }
 
Process finished  with  exit code 0


https://www.w3cschool.cn/fastjson/fastjson-api.html


fastjson SerializerFeature详解

http://blog.csdn.net/u010246789/article/details/52539576




本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/2046732,如需转载请自行联系原作者
相关文章
再也不用心惊胆战地使用FastJSON了——序列化篇
本篇将主要介绍json序列化的详细流程。本文阅读的FastJSON源码版本为2.0.31。
1658 49
|
7月前
|
niubility!即使JavaBean没有默认无参构造器,fastjson也可以反序列化。- - - - 阿里Fastjson反序列化源码分析
本文详细分析了 Fastjson 反序列化对象的源码(版本 fastjson-1.2.60),揭示了即使 JavaBean 沲有默认无参构造器,Fastjson 仍能正常反序列化的技术内幕。文章通过案例展示了 Fastjson 在不同构造器情况下的行为,并深入探讨了 `ParserConfig#getDeserializer` 方法的核心逻辑。此外,还介绍了 ASM 字节码技术的应用及其在反序列化过程中的角色。
170 10
最详细 | redis实战:JackSon/FastJson方式序列化深度解析
Jackson2JsonRedisSerializer和FastJsonRedisSerializer的实战应用
3896 0
fastjson全局日期序列化设置导致JSONField无效
fastjson通过代码指定全局序列化返回时间格式,导致使用JSONField注解标注属性的特殊日期返回格式失效
305 0
Fastjson反序列化随机性失败
Fastjson作为一款高性能的JSON序列化框架,使用场景众多,不过也存在一些潜在的bug和不足。本文主要讲述了一个具有"随机性"的反序列化错误!
380 0
Fastjson反序列化随机性失败
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等