一、介绍
电商商城定制开发是阿里巴巴的开源 JSON 解析库,电商商城定制开发它可以解析 JSON 电商商城定制开发格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串到 JavaBean。
优点
-
速度快
相对其他 JSON电商商城定制开发库的特点是快,从2011年 fastjson 发布 1.1.x 版本之后,其性能从未被其他Java实现的JSON库超越。 -
使用广泛
fastjson 在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。 -
测试完备
fastjson有非常多的testcase,在1.2.11版本中,testcase 超过3321个。每次发布都会进行回归测试,保证质量稳定。 -
使用简单
fastjson的API十分简洁。 -
功能完备
支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。
二、使用
1. 添加依赖
implementation 'com.alibaba:fastjson:1.2.76'
- 1
2. json 字符串和 jsonObject 的转换
String user = "{\"id\":2,\"name\":\"lily\",\"age\":12}";//将json字符串转json对象,Feature.OrderedField防止乱序JSONObject jsonObject = JSON.parseObject(user, Feature.OrderedField);//toJSONString方法将json对象转json字符串String user1 = jsonObject.toJSONString();
- 1
- 2
- 3
- 4
- 5
3. json 字符串与 jsonArray 的转换
String user = "[{\"id\":2,\"name\":\"lily\",\"age\":12},{\"id\":3,\"name\":\"mary\",\"age\":23}]";//json字符串转jsonArrayJSONArray jsonArray = JSON.parseArray(user);for (Object o : jsonArray){ JSONObject j = (JSONObject) o; Long id = j.getLong("id"); String name = j.getString("name");}///jsonArray转json字符串String userString = jsonArray.toJSONString();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
4. jsonObject,jsonArray 嵌套
String user = "{\"id\":12,\"name\":\"wei\",\"teacher\":{\"name\":\"kasa\",\"age\":77},\"student\":[{\"id\":2,\"name\":\"lily\",\"age\":12},{\"id\":3,\"name\":\"mary\",\"age\":23}]}";JSONObject jsonObject = JSON.parseObject(user);Long id = jsonObject.getLong("id");String name = jsonObject.getString("name");JSONObject jsonObjectTeacher = jsonObject.getJSONObject("teacher");String teacherName = jsonObjectTeacher.getString("name");JSONArray jsonArray = jsonObject.getJSONArray("student");for (Object o : jsonArray){ JSONObject j = (JSONObject) o; Long studentId = j.getLong("id"); String studentName = j.getString("name");}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
5. json 字符串与 jsonbean 转换
String userString = "{\"id\":2,\"name\":\"lily\",\"age\":12}";//json字符串转javabeanUser user = JSON.parseObject(userString, new TypeReference<User>(){});//javabean转json字符串String userJsonString = JSON.toJSONString(user);//javabean转jsonObjectJSONObject jsonObject = (JSONObject) JSON.toJSON(user);String userArrayString = "[{\"id\":2,\"name\":\"lily\",\"age\":12},{\"id\":3,\"name\":\"mary\",\"age\":23}]";//jsonArray转javabean集合ArrayList<User> userList = JSON.parseObject(userArrayString, new TypeReference<ArrayList<User>>(){});//对象转mapMap<String,Object> map = JSON.parseObject(JSON.toJSONString(user), new TypeReference<Map<String,Object>>(){});//map转对象org.apache.commons.beanutils.BeanUtils.populate(obj, map);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
三、超大 json 文件解析
通过使用 JSON Stream Api 解析超大 json 文件。
String FILE_PATH = "C:\\Users\\Administrator\\Desktop\\user.json";JSONReader jsonReader = new JSONReader(new FileReader(new File(FILE_PATH)));jsonReader.startArray();while(jsonReader.hasNext()){ /*3种方式取得json 1.转成json对象 JSONObject jsonObject = (JSONObject) jsonReader.readObject(); String name = jsonObject.getString("name"); System.out.println(name); 2.通过JSONStreamContext对象迭代 jsonReader.startObject(); while(jsonReader.hasNext()) { String objKey = jsonReader.readString(); String objVal = jsonReader.readObject().toString(); System.out.println("key: " + objKey + ", value: " + objVal); } jsonReader.endObject(); 3.转成javabean User user = jsonReader.readObject(User.class);*/}jsonReader.endArray();jsonReader.close();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
四、序列化扩展
1. PropertyPreFilter 根据 PropertyName 判断是否序列化
PropertyPreFilter filter = new PropertyPreFilter() { @Override public boolean apply(JSONSerializer jsonSerializer, Object o, String s) { if ("id".equals(s)) { return true; } return false; }};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
2. PropertyFilter 根据 PropertyName 和 PropertyValue 来判断是否序列化
PropertyFilter filter = new PropertyFilter() { @Override public boolean apply(Object source, String name, Object value) { // 属性是id并且大于等于100时进行序列化 if ("id".equals(name)) { long id = ((Long) value).longValue(); return id >= 100; } return false; }};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
3. NameFilter 修改 Key,如果需要修改 Key,process 返回值则可
NameFilter filter = new NameFilter() { @Override public String process(Object object, String name, Object value) { // 属性是id是修改id的名字 return name + "$"; }};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4. ValueFilter 修改 Value
ValueFilter filter = new ValueFilter() { @Override public Object process(Object object, String name, Object value) { return value+ "$"; }};
- 1
- 2
- 3
- 4
- 5
- 6
5. BeforeFilter 序列化时在最前添加内容
BeforeFilter filter = new BeforeFilter() { @Override public void writeBefore(Object object) { User user = (User) object; user.setName(user.getName() + "$$$"); }};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
6. AfterFilter 序列化时在最后添加内容
AfterFilter filter = new AfterFilter() { @Override public void writeAfter(Object object) { User user = (User) object; user.setName(user.getName() + "$$$"); }};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
五、数据格式转换 SerializerFeature
WriteMapNullValue 是否输出值为 null 的字段,默认为 false
WriteNullListAsEmpty List 字段如果为 null, 输出为 [], 而非 nullWriteNullStringAsEmpty 字符类型字段如果为 null, 输出为”“, 而非 nullWriteNullNumberAsZero 数值字段如果为 null, 输出为 0, 而非 nullWriteNullBooleanAsFalse Boolean 字段如果为 null, 输出为 false, 而非 nullDisableCircularReferenceDetect 消除对同一对象循环引用的问题,默认为 false
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
SerializerFeature feature = SerializerFeature.DisableCircularReferenceDetect;String userString = JSON.toJSONString(maps,feature);
- 1
- 2
在 springboot 中使用:
自定义类继承 WebMvcConfigurerAdapter,重写 configureMessageConverters () 方法
@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters); FastJsonHttpMessageConverter fastConverters = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.WriteNullNumberAsZero ); fastConverters.setFastJsonConfig(fastJsonConfig); converters.add(fastConverters);}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11