首页 > 编程知识 正文

fastjson 问题,fastjson解析json字符串失败

时间:2023-05-03 07:40:27 阅读:199090 作者:4875

FastJson使用中遇到的问题及解决办法 一、实体类定义的变量首字母大写,结果生成的JSON串首字母却是小写的问题

User类

import lombok.Data;@Datapublic class User {/** * 姓名 */String NAME;/** * 年龄 */Integer AGE;public User(String name, Integer age) {super();NAME = name;AGE = age;}}

测试类:

import com.alibaba.fastjson.JSONObject;public class Test {public static void main(String[] args) {User user = new User("自然的日记本", 18);System.out.println(JSONObject.toJSONString(user));}}

输入

{"aGE":18,"nAME":"自然的日记本"} 解决方法一:在实体类的变量上加@JSONField注解,修改后的User类如下: @Datapublic class User {/** * 姓名 */@JSONField(name = "NAME")String NAME;/** * 年龄 */@JSONField(name = "AGE")Integer AGE;public User(String name, Integer age) {super();NAME = name;AGE = age;}}

输出如下:

{"AGE":18,"NAME":"自然的日记本"} 解决方法二:在调用JSONObject.toJSONString()方法前加入**TypeUtils.compatibleWithJavaBean = true;**

测试类:

import com.alibaba.fastjson.JSONObject;public class Test {public static void main(String[] args) {User user = new User("自然的日记本", 18);// 开启转化后的字符串首字母大写TypeUtils.compatibleWithJavaBean = true;System.out.println(JSONObject.toJSONString(user));}}

输出如下:

{"AGE":18,"NAME":"自然的日记本"} 解决方法三:通过SerializeFilter的实现类PascalNameFilter来对其进行控制

测试类:

import com.alibaba.fastjson.JSONObject;public class Test {public static void main(String[] args) {User user = new User("自然的日记本", 18);System.out.println(JSON.toJSONString(user, new PascalNameFilter(), SerializerFeature.WriteMapNullValue));}}

输出如下:

{"AGE":18,"NAME":"自然的日记本"} 二、将字符串转换成JSONObject后,取某一节点再转成字符串,字段顺序和原始字符串中的顺序不一致的问题

测试类:

import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;public class Test {public static void main(String[] args) {String str= "{"sqid":"000000001","sfzhm":"110101198506020038","xm":"姓名","sjh":"15184613226","xdacfd":"01","qtbz":"其他备注","xhjqxzqh":"110101000000","xhjdz":"现户籍地址","cslsgzksy":"201801","cslsgzjsy":"201812","lsgzdwmc":"临时工作单位名称","lsgzhjd":"110101000000","lsgzdwsfcz":"1","sftx":"1","grsq":"个人诉求","sfktgzm":"0","lsgzdwszq":"110101000000","sqsj":"20200807135600"}";System.out.println("转换前:"+str);JSONObject obj = (JSONObject) JSONObject.parse(str);System.out.println("-------------------------------------------------------");System.out.println("转换后:"+obj.toJSONString());}}

输出:

转换前:{"sqid":"000000001","sfzhm":"110101198506020038","xm":"姓名","sjh":"15184613226","xdacfd":"01","qtbz":"其他备注","xhjqxzqh":"110101000000","xhjdz":"现户籍地址","cslsgzksy":"201801","cslsgzjsy":"201812","lsgzdwmc":"临时工作单位名称","lsgzhjd":"110101000000","lsgzdwsfcz":"1","sftx":"1","grsq":"个人诉求","sfktgzm":"0","lsgzdwszq":"110101000000","sqsj":"20200807135600"}-------------------------------------------------------转换后:{"sqsj":"20200807135600","sftx":"1","lsgzdwsfcz":"1","cslsgzjsy":"201812","cslsgzksy":"201801","sfzhm":"110101198506020038","lsgzhjd":"110101000000","sfktgzm":"0","sqid":"000000001","lsgzdwszq":"110101000000","qtbz":"其他备注","sjh":"15184613226","xm":"姓名","lsgzdwmc":"临时工作单位名称","xhjqxzqh":"110101000000","xdacfd":"01","grsq":"个人诉求","xhjdz":"现户籍地址"} 解决办法:JSONObject内部是用Hashmap来存储的,所以输出是按key的排序来的,如果要让JSONObject按固定顺序(put的顺序)排列,可以修改JSONObject的定义HashMap改为LinkedHashMap import java.util.LinkedHashMap;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjson.parser.Feature;public class Test_0811 {public static void main(String[] args) {String str = "{"sqid":"000000001","sfzhm":"110101198506020038","xm":"姓名","sjh":"15184613226","xdacfd":"01","qtbz":"其他备注","xhjqxzqh":"110101000000","xhjdz":"现户籍地址","cslsgzksy":"201801","cslsgzjsy":"201812","lsgzdwmc":"临时工作单位名称","lsgzhjd":"110101000000","lsgzdwsfcz":"1","sftx":"1","grsq":"个人诉求","sfktgzm":"0","lsgzdwszq":"110101000000","sqsj":"20200807135600"}";System.out.println("转换前:" + str);JSONObject obj = (JSONObject) JSONObject.parse(str);System.out.println("-------------------------------------------------------");System.out.println("转换后:" + obj.toJSONString()); System.out.println("-------------------------------------------------------");LinkedHashMap<String, Object> jsonMap = JSON.parseObject(str, LinkedHashMap.class, Feature.OrderedField);JSONObject obj1 = new JSONObject(true);obj1.putAll(jsonMap);System.out.println("转换后:" + obj1.toJSONString());}}

输出:

转换前:{"sqid":"000000001","sfzhm":"110101198506020038","xm":"姓名","sjh":"15184613226","xdacfd":"01","qtbz":"其他备注","xhjqxzqh":"110101000000","xhjdz":"现户籍地址","cslsgzksy":"201801","cslsgzjsy":"201812","lsgzdwmc":"临时工作单位名称","lsgzhjd":"110101000000","lsgzdwsfcz":"1","sftx":"1","grsq":"个人诉求","sfktgzm":"0","lsgzdwszq":"110101000000","sqsj":"20200807135600"}-------------------------------------------------------转换后:{"sqsj":"20200807135600","sftx":"1","lsgzdwsfcz":"1","cslsgzjsy":"201812","cslsgzksy":"201801","sfzhm":"110101198506020038","lsgzhjd":"110101000000","sfktgzm":"0","sqid":"000000001","lsgzdwszq":"110101000000","qtbz":"其他备注","sjh":"15184613226","xm":"姓名","lsgzdwmc":"临时工作单位名称","xhjqxzqh":"110101000000","xdacfd":"01","grsq":"个人诉求","xhjdz":"现户籍地址"}-------------------------------------------------------转换后:{"sqid":"000000001","sfzhm":"110101198506020038","xm":"姓名","sjh":"15184613226","xdacfd":"01","qtbz":"其他备注","xhjqxzqh":"110101000000","xhjdz":"现户籍地址","cslsgzksy":"201801","cslsgzjsy":"201812","lsgzdwmc":"临时工作单位名称","lsgzhjd":"110101000000","lsgzdwsfcz":"1","sftx":"1","grsq":"个人诉求","sfktgzm":"0","lsgzdwszq":"110101000000","sqsj":"20200807135600"} 三、FastJson默认过滤null值,不显示null值字段

测试类:

import java.util.HashMap;import java.util.Map;import com.alibaba.fastjson.JSONObject;public class Test_1105 {public static void main(String[] args) {Map<String, Object> map = new HashMap<String, Object>() {{put("age", 18);put("name", "自然的日记本");put("sex", null);}};System.out.println(JSONObject.toJSONString(map));}}

输出:

{"name":"自然的日记本","age":18} 解决办法:在转换的时修改FastJson的SerializerFeature序列化属性 import java.util.HashMap;import java.util.Map;import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjson.serializer.SerializerFeature;public class Test_1105 {public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(3) { { put("age", 18); put("name", "自然的日记本"); put("sex", null); } }; System.out.println(JSONObject.toJSONString(map, SerializerFeature.WriteMapNullValue)); }}

输出:

{"sex":null,"name":"自然的日记本","age":18} SerializerFeature常用属性 属性中文描述QuoteFieldNames输出key时是否使用双引号,默认为trueWriteMapNullValue是否输出值为null的字段,默认为falseWriteNullNumberAsZero数值字段如果为null,输出为0,而非nullWriteNullListAsEmptyList字段如果为null,输出为[],而非nullWriteNullStringAsEmpty字符类型字段如果为null,输出为”“,而非nullWriteNullBooleanAsFalseBoolean字段如果为null,输出为false,而非null四、FastJson输出字段乱序的问题

测试类:

import com.alibaba.fastjson.JSONObject;public class Test_110501 { public static void main(String[] args) { JSONObject obj = new JSONObject(); obj.put("age", 18); obj.put("name", "自然的日记本"); obj.put("sex", "男"); obj.put("school", "北京大学"); obj.put("position", "北京"); System.out.println(obj.toJSONString()); }}

输出:

{"school":"北京大学","sex":"男","name":"自然的日记本","position":"北京","age":18}

可以看到输出的顺序并没有按照上方定义的Map的插入字段顺序输出

解决办法:在初始化JSONObject时,使用带排序的构成函数初始化 import com.alibaba.fastjson.JSONObject;public class Test_110501 { public static void main(String[] args) { JSONObject obj = new JSONObject(true); obj.put("age", 18); obj.put("name", "自然的日记本"); obj.put("sex", "男"); obj.put("school", "北京大学"); obj.put("position", "北京"); System.out.println(obj.toJSONString()); }}

输出:

{"age":18,"name":"自然的日记本","sex":"男","school":"北京大学","position":"北京"}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。