FastJson相关内容

标签: Java 分类: Java 创建时间:2020-02-20 07:49:05 更新时间:2024-11-15 10:49:43

为了处理前端传入的json字符串,我使用了阿里的fastjson库处理json字符串。主要有以下几点:

1.加入Maven库

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>

2.有关类库的一些说明

fastjson中主要有两类,一种是JSONArray,一种是JSONObject,JAONArray相当于List < object >,JSONObject相当于Map < String, Object >。JSONObject可以使用 get(“key”) 方法获取相应的值。fastjson还提供了多种get方法,比如直接获取int类型的getInterger,直接获取String类型的getString方法,还有其他的一些。JSONArray,可以使用get(index),获取某一个位置的对象,也可以使用size()方法获取数组长度,也可以通过getObject(index,Object.class),直接将相应序号上的对象转换为某一个类型。

3.更新和添加值

fastjson更新或者添加一个值,只需要使用对象的 jsonObject.put() 方法即可。

4.序列化与反序列化

(1) 序列化
JSON.toJSONString() 方法
(2) 反序列化
JSON.parse(),fastjson还提供了序列化方法的重载,只需要传入相对于的参数个数即可。也可以使用JSON.parseObject(text) 方法。

(3) 序列话的时候顺序问题

1
2
3
4
5
6
7
8
9
// 方法1、解析时增加参数不调整顺序
JSONObject respondeBodyJson = JSONObject.parseObject(jsonStr, Feature.OrderedField);

// 方法2、初始化json对象为有序对象:
JSONObject retObj = new JSONObject(true);
// 这样生成的json对象就与放入数据时一致。

// 方法3、使用Gson解析
JsonObject returnData = new JsonParser().parse(replyString).getAsJsonObject();

5.遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
// 方法一
JSONObject jsonObject = JSONObject.parseObject(str);
for (Object map : jsonObject.entrySet()){
String key=((Map.Entry)map).getKey().toString();
String value=((Map.Entry)map).getValue().toString();
}

// 方法二
for (Map.Entry entry :jsonObject.entrySet()) {
String key=map.getKey().toString();
String value=map.getValue().toString();
}

不知道是不是版本的问题,我这里的jsonObject没有keys()函数。

6.序列化时首字母被转换成了小写

在使用fastjson进行序列化的时候,调用了JSONObject.toJSONString()方法,出现了原本本该是大写字母的键,最后变成了小写。

1
2
3
4
5
6
JSONObject json=new JSONObject();
json.put("Db","ddd");
json.put("SbD","ddd");
json.put("dBB","ddd");

json.toJSONString();

调用toJSONString方法的对象本身就是一个JSONObject对象。

解决方法就是在序列化之前,调用compatibleWithFieldName和compatibleWithJavaBean,然后在序列化,这样首字母就不会被小写了。FastJson在进行操作时,是根据getter和setter的方法进行的,并不是依据Field进行。

1
2
3
TypeUtils.compatibleWithFieldName = true;
TypeUtils.compatibleWithJavaBean =true;
String u=userInfo.toJSONString();

经过测试,这样有个缺点,就是原本就是小写的,被转换成了大写,对应于参考文章3中的,使用lombok的情况。所以查询资料,很多都是设置@JSONField注解,但是这是针对一个类中的字段,但是我这个对象,本身就是JSONObject,根本就没有地方写这个注解啊。

最后我还是屈服于@JSONFiled注解了
还有就是,如果配置文件中配置了下面的内容,那么@ResquestBody返回的内容,全部的首字母都会变成大写了。

1
2
3
spring:
jackson:
property-naming-strategy: UPPER_CAMEL_CASE

7.序列化时设置将null转为””

在使用toJSONString()方法时,如果属性值为null,那么fastjson默认是忽略这个值的,可以通过设置序列化时的属性信息,自定义将null序列化为空值。

1
JSONObject.toJSONString(resultMap, SerializerFeature.WriteMapNullValue);

8.有序排列

默认存储和解析时,fastjson都是无序的,但是排除不了需要有序的情况。

1
2
3
4
5
6
7
8
// 序列化时有序
JSON.toJSONString(globalConfig,SerializeConfig.getGlobalInstance(), SerializerFeature.QuoteFieldNames);

// 新建时有序,添加true参数
JSONObject result=new JSONObject(true);

// 字符串转换时有序
JSONObject globalConfig=JSONObject.parseObject(glbalStr,JSONObject.class, Feature.OrderedField);
参考文章:
1.fastjson存在乱序的问题 (这篇文章还是比较有用的)
2.fastjson JSONObject 使属性有序 (这篇文章简单了点)
3.fastjson JSONObject 怎么设置成有序 (这篇文章有些过时了,但是使用SerializeConfig.getGlobalInstance(), SerializerFeature.QuoteFieldNames)还是有用的
4.jsonobject顺序不对怎么办?jsonobject有序排列方法 这里使用了 JSONObject jsob = new JSONObject(new LinkedHashMap()); 我尝试了不起作用。
5.JSONObject按put顺序排放与输出 和上面的方案差不多
6.fastjson key 排序方式 这里使用的是TreeMap

9.fastjson2的问题

使用fastjson2,这里和fastjson1.0还是有点不同的。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。