FastJson的使用心得

          本文为早前整理,参考文献已找不到,如有侵权请与我联系,添加参考链接。

一丶基本使用

1.1主要API

fastjson入口类是com.alibaba.fastjson.JSON,主要的API是JSON.toJSONString,和parseObject。

1 package com.alibaba.fastjson;
2 3 public abstract class JSON {
4       public static final String toJSONString(Object object);
5       public static final <T> T parseObject(String text, Class<T> clazz, Feature... features);
6 }

 

序列化:

String jsonString = JSON.toJSONString(obj);

反序列化:

VO vo = JSON.parseObject("...", VO.class);

泛型反序列化:

import com.alibaba.fastjson.TypeReference;

List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});

1.2基本使用

User 类:

 1 package json.fastjson.base;
 2  3 public class User {
 4  5     private Long id;
 6     private String name;
 7  8     public Long getId() {
 9         return id;
10     }
11 12     public void setId(Long id) {
13         this.id = id;
14     }
15 16     public String getName() {
17         return name;
18     }
19 20     public void setName(String name) {
21         this.name = name;
22     }
23 24     @Override
25     public String toString() {
26         return "User [id=" + id + ", name=" + name + "]";
27     }
28 }

 


Group 类:

 1 package json.fastjson.base;
 2  3 import java.util.ArrayList;
 4 import java.util.List;
 5  6 public class Group {
 7  8     private Long id;
 9     private String name;
10     private List<User> users = new ArrayList<User>();
11 12     public Long getId() {
13         return id;
14     }
15 16     public void setId(Long id) {
17         this.id = id;
18     }
19 20     public String getName() {
21         return name;
22     }
23 24     public void setName(String name) {
25         this.name = name;
26     }
27 28     public List<User> getUsers() {
29         return users;
30     }
31 32     public void setUsers(List<User> users) {
33         this.users = users;
34     }
35 36     public void addUser(User user) {
37         users.add(user);
38     }
39 40     @Override
41     public String toString() {
42         return "Group [id=" + id + ", name=" + name + ", users=" + users + "]";
43     }
44 }

 


测试类:

 1 public class TestBase {
 2  3     public static void main(String[] args) {
 4         Group group = new Group();
 5         group.setId(0L);
 6         group.setName("admin");
 7  8         User guestUser = new User();
 9         guestUser.setId(2L);
10         guestUser.setName("guest");
11 12         User rootUser = new User();
13         rootUser.setId(3L);
14         rootUser.setName("root");
15 16         group.addUser(guestUser);
17         group.addUser(rootUser);
18 19         List<User> userList = group.getUsers();
20 21         // Group序列化
22         String jsonString = JSON.toJSONString(group);
23         System.out.println("Group序列化:" + jsonString);
24 25         // Group反序列化
26         jsonString = "{\"id\":0,\"name\":\"admin\",\"users\":[{\"id\":2,\"name\":\"guest\"},{\"id\":3,\"name\":\"root\"}]}";
27         group = JSON.parseObject(jsonString, Group.class);
28         System.out.println("Group反序列化:" + group);
29 30         // List序列化
31         jsonString = JSON.toJSONString(userList);
32         System.out.println("List序列化:" + jsonString);
33 34         // List泛型反序列化
35         jsonString = "[{\"id\":2,\"name\":\"guest\"},{\"id\":3,\"name\":\"root\"}]";
36         userList = JSON.parseObject(jsonString, new TypeReference<List<User>>() {});
37         System.out.println("List反序列化:" + userList);
38     }
39 }
40 结果:
41 
42 Group序列化:{"id":0,"name":"admin","users":[{"id":2,"name":"guest"},{"id":3,"name":"root"}]}
43 Group反序列化:Group [id=0, name=admin, users=[User [id=2, name=guest], User [id=3, name=root]]]
44 List序列化:[{"id":2,"name":"guest"},{"id":3,"name":"root"}]
45 List反序列化:[User [id=2, name=guest], User [id=3, name=root]]

 

1.3测试时间

 1 public class TestDate {
 2 
 3     public static void main(String[] args) {
 4 
 5         User user = new User();
 6         user.setId(2L);
 7         user.setName("guest");
 8         user.setDate(new Date());
 9 
10         // 序列化
11         String jsonString = JSON.toJSONString(user);
12         System.out.println("序列化:" + jsonString);
13 
14         // 序列化处理时间,方式一
15         jsonString = JSON.toJSONStringWithDateFormat(user, "yyyy-MM-dd HH:mm:ss.SSS");
16         System.out.println("序列化处理时间,方式一:" + jsonString);
17 
18         // 序列化处理时间,方式二:ISO-8601日期格式
19         jsonString = JSON.toJSONString(user, SerializerFeature.UseISO8601DateFormat);
20         System.out.println("序列化处理时间,方式二:ISO-8601日期格式:" + jsonString);
21 
22         // 序列化处理时间,方式三:全局修改日期格式
23         JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
24         jsonString = JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat);
25         System.out.println("序列化处理时间,方式三:全局修改日期格式:" + jsonString);
26 
27     }
28 }
29 
30 测试结果
31 
32 序列化:{"date":1558595807672,"id":2,"name":"guest"}
33 序列化处理时间,方式一:{"date":"2019-05-23 15:16:47.672","id":2,"name":"guest"}
34 序列化处理时间,方式二:ISO-8601日期格式:{"date":"2019-05-23T15:16:47.672+08:00","id":2,"name":"guest"}
35 序列化处理时间,方式三:全局修改日期格式:{"date":"2019-05-23","id":2,"name":"guest"}

 

1.4 JSONField 和 JSONType 介绍

  • 一、JSONField 介绍 注意:1、若属性是私有的,必须有set*方法。否则无法反序列化。

 1 public @interface JSONField {
 2     // 配置序列化和反序列化的顺序,1.1.42版本之后才支持
 3     int ordinal() default 0;
 4 
 5      // 指定字段的名称
 6     String name() default "";
 7     
 8     // 指定字段的格式,对日期格式有用
 9     String format() default "";
10     
11     // 是否序列化
12     boolean serialize() default true;
13     
14     // 是否反序列化
15     boolean deserialize() default true;
16 
17 }

 

  • 二、JSONField 配置方式 FieldInfo可以配置在getter/setter方法或者字段上。例如:

    • 2.1 配置在getter/setter上

    1 public class A {
    2       private int id;
    3 
    4       @JSONField(name="ID")
    5       public int getId() {return id;}
    6       @JSONField(name="ID")
    7       public void setId(int value) {this.id = id;}
    8 
    9  }

     

    • 2.2 配置在field上

      public class A {
        @JSONField(name="ID")
        private int id;
        public int getId() {return id;}
        public void setId(int value) {this.id = id;}
       }

       

  • 三、使用format配置日期格式化

public class A {
      // 配置date序列化和反序列使用yyyyMMdd日期格式
      @JSONField(format="yyyyMMdd")
      public Date date;
 }

  

  • 四、使用serialize/deserialize指定字段不序列化

1 public class A {
2       @JSONField(serialize=false)
3       public Date date;
4  }
5 
6  public class A {
7       @JSONField(deserialize=false)
8       public Date date;
9  }

 

  • 五、使用ordinal指定字段的顺序

ordinal 默认值为 0

public static class VO {
    @JSONField(ordinal = 3)
    private int f0;

    @JSONField(ordinal = 2)
    private int f1;
    
    @JSONField(ordinal = 1)
    private int f2;

}
View Code

 

  • 六、使用serializeUsing制定属性的序列化类

在fastjson 1.2.16版本之后,JSONField支持新的定制化配置serializeUsing,可以单独对某一个类的某个属性定制序列化,比如:
 1 public static class Model {
 2     @JSONField(serializeUsing = ModelValueSerializer.class)
 3     public int value;
 4 }
 5 
 6 public static class ModelValueSerializer implements ObjectSerializer {
 7     @Override
 8     public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
 9                       int features) throws IOException {
10         Integer value = (Integer) object;
11         String text = value + "元";
12         serializer.write(text);
13     }
14 }

 

测试代码:

 1 Model model = new Model();
 2 model.value = 100;
 3 String json = JSON.toJSONString(model);
 4 Assert.assertEquals("{\"value\":\"100元\"}", json);
 5 
 6 JSONType和JSONField类似,但JSONType配置在类上,而不是field或者getter/setter方法上。这里就不再介绍了。
 7 
 8 public class User {
 9 
10     @JSONField(name = "ID", ordinal = 3, serializeUsing = UserIDValueSerializer.class)
11     private Long id;
12     @JSONField(serialize = false)
13     private String name;
14     @JSONField(serialize = true, ordinal = 2)
15     private String sex;
16     
17     @JSONField(deserialize = false)
18     private String address;
19     @JSONField(deserialize = true)
20     private String phone;
21     
22     // 配置date序列化和反序列使用yyyyMMdd日期格式
23     @JSONField(format = "yyyyMMdd", ordinal = 1)
24     private Date date;
25     
26     public Long getId() {
27         return id;
28     }
29     
30     public void setId(Long id) {
31         this.id = id;
32     }
33     
34     public String getName() {
35         return name;
36     }
37     
38     public void setName(String name) {
39         this.name = name;
40     }
41     
42     public Date getDate() {
43         return date;
44     }
45     
46     public void setDate(Date date) {
47         this.date = date;
48     }
49     
50     public String getSex() {
51         return sex;
52     }
53     
54     public void setSex(String sex) {
55         this.sex = sex;
56     }
57     
58     public String getAddress() {
59         return address;
60     }
61     
62     public void setAddress(String address) {
63         this.address = address;
64     }
65     
66     public String getPhone() {
67         return phone;
68     }
69     
70     public void setPhone(String phone) {
71         this.phone = phone;
72     }}
73     
74     UserIDValueSerializer 类:
75 
76 package json.fastjson.JSONField;
77 
78 import java.io.IOException;
79 import java.lang.reflect.Type;
80 
81 import com.alibaba.fastjson.serializer.JSONSerializer;
82 import com.alibaba.fastjson.serializer.ObjectSerializer;
83 
84 public class UserIDValueSerializer implements ObjectSerializer {
85     @Override
86     public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
87         //serializer:{"address":"杭州","phone":"18603396966","date":"20180125","sex":"男","ID":
88         //object:100
89         //fieldName:ID
90         //fieldType:class java.lang.Long
91         //features:0
92         Long value = (Long) object;
93         String text = value + "元";
94         serializer.write(text);
95     }
96 }

 

测试类:
 1 package json.fastjson.JSONField;
 2 
 3 import java.util.Date;
 4 
 5 import com.alibaba.fastjson.JSON;
 6 
 7 public class TestJSONField {
 8 
 9     public static void main(String[] args) {
10         User user = new User();
11         user.setId(100L);
12         user.setName("WaKengMaiNi");
13         user.setSex("男");
14         user.setAddress("杭州");
15         user.setPhone("18603396966");
16         user.setDate(new Date());
17     
18         // User序列化
19         String jsonString = JSON.toJSONString(user);
20         System.out.println("User序列化:" + jsonString);
21     }
22 
23 }

 

输出结果:

User序列化:{"address":"杭州","phone":"18603396966","date":"20180125","sex":"男","ID":"100元"}

1.5 通过SerializeFilter定制序列化

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

1.5.1 PropertyFilter
根据PropertyName和PropertyValue来判断是否序列化
 1 public class TestPropertyFilter {
 2 
 3     public static void main(String[] args) {
 4         PropertyFilter filter = new PropertyFilter() {
 5 
 6             @Override
 7             public boolean apply(Object source, String name, Object value) {
 8 
 9                 System.out.println("----------------source=" + source);
10                 System.out.println("----------------name=" + name);
11                 System.out.println("----------------value=" + value);
12                 System.out.println("");
13                 // 属性是id并且大于等于100时进行序列化
14                 if ("id".equals(name)) {
15                     long id = ((Long) value).longValue();
16                     return id >= 100;
17                 }
18                 return false;
19             }
20         };
21 
22         User user = new User();
23         user.setId(9L);
24         user.setName("挖坑埋你");
25 
26         String jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
27         System.out.println("序列化,id=9:" + jsonString + "\n");
28 
29         user.setId(200L);
30         jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
31         System.out.println("序列化,id=200:" + jsonString);
32     }
33 
34 }
35 测试结果
36 
37 ----------------source=User [id=9, name=挖坑埋你]
38 ----------------name=id
39 ----------------value=9
40 
41 ----------------source=User [id=9, name=挖坑埋你]
42 ----------------name=name
43 ----------------value=挖坑埋你
44 
45 序列化,id=9:{}
46 
47 ----------------source=User [id=200, name=挖坑埋你]
48 ----------------name=id
49 ----------------value=200
50 
51 ----------------source=User [id=200, name=挖坑埋你]
52 ----------------name=name
53 ----------------value=挖坑埋你
54 
55 序列化,id=200:{"id":200}

 

1.5.2 NameFilter 序列化时修改Key
 1 public class TestNameFilter {
 2 
 3     public static void main(String[] args) {
 4         User user = new User();
 5         user.setId(9L);
 6         user.setName("挖坑埋你");
 7 
 8         String jsonString = JSON.toJSONString(user); // 序列化的时候传入filter
 9         System.out.println("普通序列化:" + jsonString + "\n");
10 
11         NameFilter filter = new NameFilter() {
12 
13             @Override
14             public String process(Object object, String name, Object value) {
15                 System.out.println("----------------object=" + object);
16                 System.out.println("----------------name=" + name);
17                 System.out.println("----------------value=" + value);
18                 System.out.println("");
19                 // 属性是id是修改id的名字
20                 if ("id".equals(name)) {
21                     return name + "$";
22                 }
23                 return name;
24             }
25         };
26 
27         jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
28         System.out.println("NameFilter序列化:" + jsonString + "\n");
29 
30         // fastjson内置一个PascalNameFilter,用于输出将首字符大写的Pascal风格
31         jsonString = JSON.toJSONString(user, new PascalNameFilter()); // 序列化的时候传入filter
32         System.out.println("PascalNameFilter序列化:" + jsonString + "\n");
33     }
34 
35 }
36 普通序列化:{"id":9,"name":"挖坑埋你"}
37 
38 ----------------object=User [id=9, name=挖坑埋你]
39 ----------------name=id
40 ----------------value=9
41 
42 ----------------object=User [id=9, name=挖坑埋你]
43 ----------------name=name
44 ----------------value=挖坑埋你
45 
46 NameFilter序列化:{"id$":9,"name":"挖坑埋你"}
47 
48 PascalNameFilter序列化:{"Id":9,"Name":"挖坑埋你"}

 


1.5.3 ValueFilter 序列化时修改Value
 1 public class TestValueFilter {
 2 
 3     public static void main(String[] args) {
 4         User user = new User();
 5         user.setId(9L);
 6         user.setName("挖坑埋你");
 7 
 8         String jsonString = JSON.toJSONString(user); // 序列化的时候传入filter
 9         System.out.println("普通序列化:" + jsonString + "\n");
10 
11         ValueFilter filter = new ValueFilter() {
12 
13             @Override
14             public Object process(Object object, String name, Object value) {
15                 System.out.println("----------------object=" + object);
16                 System.out.println("----------------name=" + name);
17                 System.out.println("----------------value=" + value);
18                 System.out.println("");
19                 // 属性是id时修改id的值
20                 if ("id".equals(name)) {
21                     long id = ((Long) value).longValue();
22                     return id + "$";
23                 }
24                 return value;
25             }
26         };
27 
28         jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
29         System.out.println("ValueFilter序列化:" + jsonString + "\n");
30     }
31 
32 }
33 测试结果:
34 普通序列化:{"id":9,"name":"挖坑埋你"}
35 
36 ----------------object=User [id=9, name=挖坑埋你]
37 ----------------name=id
38 ----------------value=9
39 
40 ----------------object=User [id=9, name=挖坑埋你]
41 ----------------name=name
42 ----------------value=挖坑埋你
43 
44 ValueFilter序列化:{"id":"9$","name":"挖坑埋你"}

 

1.5.4 BeforeFilter 序列化时在最前添加内容
 1 public static void main(String[] args) {
 2         User user = new User();
 3         user.setId(9L);
 4         user.setName("挖坑埋你");
 5 
 6         String jsonString = JSON.toJSONString(user); // 序列化的时候传入filter
 7         System.out.println("普通序列化:" + jsonString + "\n");
 8 
 9         BeforeFilter filter = new BeforeFilter() {
10 
11             @Override
12             public void writeBefore(Object object) {
13 
14                 System.out.println("----------------object=" + object);
15 
16                 User user = (User) object;
17                 System.out.println(
18                         "----------------User.id=" + user.getId() + " " + "User.name=" + user.getName() + "\n");
19                 user.setName(user.getName() + "$$$");
20             }
21         };
22 
23         jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
24         System.out.println(user);
25         System.out.println("BeforeFilter序列化:" + jsonString + "\n");
26 
27     }
28 测试结果
29 
30 普通序列化:{"id":9,"name":"挖坑埋你"}
31 在序列化之前就修改值,这样拿到的是变化的。
32 ----------------object=User [id=9, name=挖坑埋你]
33 ----------------User.id=9 User.name=挖坑埋你
34 
35 User [id=9, name=挖坑埋你$$$]
36 BeforeFilter序列化:{"id":9,"name":"挖坑埋你$$$"}

 

1.5.5 AfterFilter 序列化时在最后添加内容
 1 public static void main(String[] args) {
 2         User user = new User();
 3         user.setId(9L);
 4         user.setName("挖坑埋你");
 5 
 6         String jsonString = JSON.toJSONString(user); // 序列化的时候传入filter
 7         System.out.println("普通序列化:" + jsonString + "\n");
 8 
 9         AfterFilter filter = new AfterFilter() {
10 
11             @Override
12             public void writeAfter(Object object) {
13 
14                 User user = (User) object;
15                 System.out.println("------------User.id=" + user.getId() + " " + "User.name=" + user.getName() + "\n");
16                 user.setName(user.getName() + "$$$");
17             }
18         };
19 
20         jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
21         System.out.println("AfterFilter序列化:" + jsonString + "\n");
22         System.out.println(user);
23 
24     }
25 测试结果
26 
27 普通序列化:{"id":9,"name":"挖坑埋你"}
28 
29 ------------User.id=9 User.name=挖坑埋你
30 
31 AfterFilter序列化:{"id":9,"name":"挖坑埋你"}
32 
33 User [id=9, name=挖坑埋你$$$]

 

1.6 定制反序列化

1.6.1 使用 ExtraProcessor 处理多余字段
 1 public class VO {
 2     private int id;
 3     private Map<String, Object> attributes = new HashMap<String, Object>();
 4 
 5     public int getId() {
 6         return id;
 7     }
 8 
 9     public void setId(int id) {
10         this.id = id;
11     }
12 
13     public Map<String, Object> getAttributes() {
14         return attributes;
15     }
16 
17     @Override
18     public String toString() {
19         return "VO [id=" + id + ", attributes=" + attributes + "]";
20     }
21 }
22 
23 public class TestExtraProcessor {
24 
25     public static void main(String[] args) {
26 
27         ExtraProcessor processor = new ExtraProcessor() {
28             public void processExtra(Object object, String key, Object value) {
29 
30                 System.out.println("---------------object = " + object);
31                 System.out.println("---------------key = " + key);
32                 System.out.println("---------------value = " + value);
33                 System.out.println();
34 
35                 VO vo = (VO) object;
36                 vo.setId(789);// 修改一下id值
37                 vo.getAttributes().put(key, value);
38             }
39         };
40         // 这里name和phone是多余的,在VO里没有
41         VO vo = JSON.parseObject("{\"id\":123,\"name\":\"abc\",\"phone\":\"18603396954\"}", VO.class, processor);
42 
43         System.out.println("vo.getId() = " + vo.getId());
44         System.out.println("vo.getAttributes().get(\"name\") = " + vo.getAttributes().get("name"));
45         System.out.println("vo.getAttributes().get(\"phone\") = " + vo.getAttributes().get("phone"));
46     }
47 
48 }
49 测试结果:
50 
51 ---------------object = VO [id=123, attributes={}]
52 ---------------key = name
53 ---------------value = abc
54 
55 ---------------object = VO [id=789, attributes={name=abc}]
56 ---------------key = phone
57 ---------------value = 18603396954
58 
59 VO [id=789, attributes={phone=18603396954, name=abc}]
60 vo.getId() = 789
61 vo.getAttributes().get("name") = abc
62 vo.getAttributes().get("phone") = 18603396954

 

1.6.2 使用ExtraTypeProvider 为多余的字段提供类型
 1 public class TestExtraTypeProvider {
 2 
 3     public static void main(String[] args) {
 4 
 5         ExtraProcessor processor = new MyExtraProcessor();
 6 
 7         VO vo = JSON.parseObject("{\"id\":123,\"value\":\"123456\"}", VO.class, processor);
 8 
 9         System.out.println("vo.getId() = " + vo.getId());
10         System.out.println("vo.getAttributes().get(\"value\") = " + vo.getAttributes().get("value"));
11         System.out.println("vo.getAttributes().get(\"value\").getClass() = " + vo.getAttributes().get("value").getClass());
12         // value本应该是字符串类型的,通过getExtraType的处理变成Integer类型了。
13     }
14 
15 }
16 
17 class MyExtraProcessor implements ExtraProcessor, ExtraTypeProvider {
18     public void processExtra(Object object, String key, Object value) {
19         VO vo = (VO) object;
20         vo.getAttributes().put(key, value);
21     }
22 
23     public Type getExtraType(Object object, String key) {
24 
25         System.out.println("---------------object = " + object);
26         System.out.println("---------------key = " + key);
27         System.out.println();
28 
29         if ("value".equals(key)) {
30             return int.class;
31         }
32         return null;
33     }
34 };
35 ---------------object = VO [id=123, attributes={}]
36 ---------------key = value
37 
38 vo.getId() = 123
39 vo.getAttributes().get("value") = 123456
40 vo.getAttributes().get("value").getClass() = class java.lang.Integer

 

1.7 处理超大对象和超大JSON文本

1.7.1 超大JSON数组序列化
 1 public class TestHugeArraySerialize {
 2 
 3     public static void main(String[] args) throws IOException {
 4         JSONWriter writer = new JSONWriter(new FileWriter("hugeArray.json"));
 5         writer.startArray();
 6         for (int i = 0; i < 10; ++i) {
 7             writer.writeValue(new VO(i));
 8         }
 9         writer.endArray();
10         writer.close();
11     }
12 
13 }

 

运行结果

[{"attributes":{},"id":0},{"attributes":{},"id":1},{"attributes":{},"id":2},{"attributes":{},"id":3},{"attributes":{},"id":4},{"attributes":{},"id":5},{"attributes":{},"id":6},{"attributes":{},"id":7},{"attributes":{},"id":8},{"attributes":{},"id":9}]
1.7.2 超大JSON对象序列化
public class TestHugeObjectSerialize {

    public static void main(String[] args) throws IOException {

        JSONWriter writer = new JSONWriter(new FileWriter("hugeObject.json"));
        writer.startObject();
        for (int i = 0; i < 10; ++i) {
            writer.writeKey("x" + i);
            writer.writeValue(new VO(i));
        }
        writer.endObject();
        writer.close();
    }

}
运行结果

{"x0":{"attributes":{},"id":0},"x1":{"attributes":{},"id":1},"x2":{"attributes":{},"id":2},"x3":{"attributes":{},"id":3},"x4":{"attributes":{},"id":4},"x5":{"attributes":{},"id":5},"x6":{"attributes":{},"id":6},"x7":{"attributes":{},"id":7},"x8":{"attributes":{},"id":8},"x9":{"attributes":{},"id":9}}
1

 

1.7.3 超大JSON数组反序列化
 1 public class TestHugeArrayDeserialize {
 2 
 3     public static void main(String[] args) throws IOException {
 4         // 读入上面输出的文件
 5         JSONReader reader = new JSONReader(new FileReader("hugeArray.json"));
 6         reader.startArray();
 7         while (reader.hasNext()) {
 8             VO vo = reader.readObject(VO.class);
 9             System.out.println(vo);
10         }
11         reader.endArray();
12         reader.close();
13     }
14 
15 }
16 VO [id=0, attributes={}]
17 VO [id=1, attributes={}]
18 VO [id=2, attributes={}]
19 VO [id=3, attributes={}]
20 VO [id=4, attributes={}]
21 VO [id=5, attributes={}]
22 VO [id=6, attributes={}]
23 VO [id=7, attributes={}]
24 VO [id=8, attributes={}]
25 VO [id=9, attributes={}]

 

1.7.4 超大JSON对象反序列化
 1 public class TestHugeObjectDeserialize {
 2 
 3     public static void main(String[] args) throws IOException {
 4         // 读入上面输出的文件
 5         JSONReader reader = new JSONReader(new FileReader("hugeObject.json"));
 6         reader.startObject();
 7         while (reader.hasNext()) {
 8             String key = reader.readString();
 9             VO vo = reader.readObject(VO.class);
10             System.out.println(key + ":" + vo);
11         }
12         reader.endObject();
13         reader.close();
14     }
15 
16 }
17 x0:VO [id=0, attributes={}]
18 x1:VO [id=1, attributes={}]
19 x2:VO [id=2, attributes={}]
20 x3:VO [id=3, attributes={}]
21 x4:VO [id=4, attributes={}]
22 x5:VO [id=5, attributes={}]
23 x6:VO [id=6, attributes={}]
24 x7:VO [id=7, attributes={}]
25 x8:VO [id=8, attributes={}]
26 x9:VO [id=9, attributes={}]

 

1.8 SerializerFeature特性的使用

名称含义
QuoteFieldNames 输出key时是否使用双引号,默认为true
UseSingleQuotes 使用单引号而不是双引号,默认为false
WriteMapNullValue 是否输出值为null的字段,默认为false
WriteEnumUsingToString Enum输出name()或者original,默认为false
UseISO8601DateFormat Date使用ISO8601格式输出,默认为false
WriteNullListAsEmpty List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty 字符类型字段如果为null,输出为”“,而非null
WriteNullNumberAsZero 数值字段如果为null,输出为0,而非null
WriteNullBooleanAsFalse Boolean字段如果为null,输出为false,而非null
SkipTransientField 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
SortField 按字段名称排序后输出。默认为false
WriteTabAsSpecial 把\t做转义输出,默认为false不推荐设为true
PrettyFormat 结果是否格式化,默认为false
WriteClassName 序列化时写入类型信息,默认为false。反序列化是需用到
DisableCircularReferenceDetect 消除对同一对象循环引用的问题,默认为false
WriteSlashAsSpecial 对斜杠’/’进行转义
BrowserCompatible 将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
WriteDateUseDateFormat 全局修改日期格式,默认为false。
DisableCheckSpecialChar 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
BeanToArray 将对象转为array输出
 1 public class TestNull {
 2 
 3     public static void main(String[] args) {
 4 
 5         // WriteNullListAsEmpty 将Collection类型字段的字段空值输出为[]
 6         // WriteNullStringAsEmpty 将字符串类型字段的空值输出为空字符串 ""
 7         // WriteNullNumberAsZero 将数值类型字段的空值输出为0
 8         // WriteNullBooleanAsFalse 将Boolean类型字段的空值输出为false
 9 
10         Model obj = new Model();
11 
12         System.out.println("------------------加上参数------------------------------");
13         String text = JSON.toJSONString(obj, 
14                 SerializerFeature.WriteNullListAsEmpty, 
15                 SerializerFeature.WriteNullStringAsEmpty,
16                 SerializerFeature.WriteNullNumberAsZero,
17                 SerializerFeature.WriteNullBooleanAsFalse,
18                 SerializerFeature.WriteMapNullValue,
19                 SerializerFeature.PrettyFormat);
20 
21         System.out.println(text + " \n");
22 
23         System.out.println("------------------不加参数------------------------------");
24         text = JSON.toJSONString(obj,
25                 SerializerFeature.PrettyFormat);
26 
27         System.out.println(text);
28     }
29 
30 }
31 
32 class Model {
33     public int iFull = 9;
34     public int iEmpty;
35 
36     public Integer integerFull = 9;
37     public Integer integerEmpty;
38 
39     public boolean bFull = true;
40     public boolean bEmpty;
41 
42     public Boolean BFull = true;
43     public Boolean BEmpty;
44 
45     public List<String> listFull = Arrays.asList("挖", "坑", "埋", "你");
46     public List<String> listEmpty;
47 
48     public Map<String, String> mapFull = new HashMap<String, String>() {{put("a", "b");}};
49     public Map<String, String> mapEmpty;
50 
51 }
52 ------------------加上参数------------------------------
53 {
54     "BEmpty":false,
55     "BFull":true,
56     "bEmpty":false,
57     "bFull":true,
58     "iEmpty":0,
59     "iFull":9,
60     "integerEmpty":0,
61     "integerFull":9,
62     "listEmpty":[],
63     "listFull":[
64         "挖",
65         "坑",
66         "埋",
67         "你"
68     ],
69     "mapEmpty":null,
70     "mapFull":{
71         "a":"b"
72     }
73 } 
74 
75 ------------------不加参数------------------------------
76 {
77     "BFull":true,
78     "bEmpty":false,
79     "bFull":true,
80     "iEmpty":0,
81     "iFull":9,
82     "integerFull":9,
83     "listFull":[
84         "挖",
85         "坑",
86         "埋",
87         "你"
88     ],
89     "mapFull":{
90         "a":"b"
91     }
92 }

 

posted @ 2019-10-11 18:37  天宇轩-王  阅读(514)  评论(1编辑  收藏  举报