首页 > 其他分享 >Alibaba FastJSON 反序列化json时字段值未成功赋值

Alibaba FastJSON 反序列化json时字段值未成功赋值

时间:2023-06-08 21:13:25浏览次数:44  
标签:FastJSON 段值 序列化 解析 parser input null processor

FastJson 是一个将对象序列化为json字符串和将字符串反序列化为对象的一个工具,但是在反序列化解析时,可能会出现字段值丢失的问题,笔者在手撸rpc框架的时候,对于客户端传过来的json字符串总是有一个字段值解析为null,在客户端解析却又是正常的,花费了很多时间去找这个bug,通过解析JsonparseObject的源码,发现最终实现解析的关键代码在于、

 public static <T> T parseObject(String input, Type clazz, ParserConfig config, ParseProcess processor,
                                          int featureValues, Feature... features) {
        if (input == null || input.length() == 0) {
            return null;
        }

        if (features != null) {
            for (Feature feature : features) {
                featureValues |= feature.mask;
            }
        }

        DefaultJSONParser parser = new DefaultJSONParser(input, config, featureValues);

        if (processor != null) {
            if (processor instanceof ExtraTypeProvider) {
                parser.getExtraTypeProviders().add((ExtraTypeProvider) processor);
            }

            if (processor instanceof ExtraProcessor) {
                parser.getExtraProcessors().add((ExtraProcessor) processor);
            }

            if (processor instanceof FieldTypeResolver) {
                parser.setFieldTypeResolver((FieldTypeResolver) processor);
            }
        }

        T value = (T) parser.parseObject(clazz, null); 这里是最终parse的关键

        parser.handleResovleTask(value);

        parser.close();

        return (T) value;
    }

总而言之,FastJSON 在解析对象时,是通过对象的构造函数来组装对象的,而我的问题就在于一个字段的构造函数的入参名称与类的属性名称不一样,所以会导致参数传入失败,只需要更改名字就行了。

标签:FastJSON,段值,序列化,解析,parser,input,null,processor
From: https://www.cnblogs.com/studyConfig/p/17467676.html

相关文章

  • Nacos集群Raft反序列化漏洞-修复
    近日,奇安信CERT监测到 Nacos集群Raft反序列化漏洞(QVD-2023-13065),在Nacos集群处理部分Jraft请求时,攻击者可以无限制使用hessian进行反序列化利用,最终实现代码执行。鉴于该漏洞仅影响集群间通信端口7848(默认配置下),若部署时已进行限制或未暴露则风险可控,建议客户做好自查及防护......
  • 使用SQL中的update更新多个字段值
    使用SQL中的update更新多个字段值,set后面的条件要用逗号不能用andset后面的多个条件之间没有关联也不可以有关联,所以就不能用and了;where条件后面可以为and如:updatetablesetsex='男',name='张三'whereid=1;         正确updatetablesetsex='男'and......
  • C# 中的序列化
    1/*****************序列化与反序列化***************23*1.把对象转换为字节序列的过程称为对象的序列化。4*2.把字节序列恢复为对象的过程称为对象的反序列化。5*3.最简单的方法是使用Serializable属性对类进行标记6*4.IFormatter提供序列化的接口7......
  • 克隆和序列化应用(附面试题)
    克隆在开始学习克隆之前,我们先来看看下面的代码,普通的对象复制,存在什么问题?classCloneTest{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{//等号赋值(基本类型)intnumber=6;intnumber2=number;//......
  • Json解析字符串报错syntax error, expect {, actual string, pos 0, fastjson-version
    ExpectedBEGIN_OBJECTbutwasSTRINGatline1column2path$syntaxerror,expect{,actualstring,pos0,fastjson-version1.2.62syntaxerror,expect{,actualstring,pos0,fastjson-version1.2.62以上的报错都是Json字符串格式错误,比如缺少{},比如两头多了......
  • 序列化模块JSON
    序列化模块什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。【一】为什么要有序列化模块比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里然后另一个python程序再从文件里......
  • SpringMVC 3使用Fastjson代替Jackson
    [size=large][color=red]Json解析教程(四.FastJson的使用)[/color][/size][url]http://zyjustin9.iteye.com/blog/2020533[/url]1.[代码][Java]代码publicclassUser{privateLongid;privateStringname;publicLonggetId(){retur......
  • Request类源码分析、序列化组件介绍、序列化类的基本使用、常用字段类和参数、反序列
    目录一、Request类源码分析二、序列化组件介绍三、序列化类的基本使用查询所有和查询单条四、常用字段类和参数(了解)常用字段类字段参数(校验数据来用的)五、反序列化之校验六、反序列化之保存七、APIVIew+序列化类+Response写的五个接口代码八、序列化高级用法之source(了解)九、......
  • C# Newtonsoft.Json JsonSerializerSettings配置序列化操作
    @@newtonsoft.json序列化  JsonSerializerSettings常用配置整理忽略某些属性默认值的处理空值的处理支持非公共成员日期处理(DateFormatHandling)自定义序列化的字段名称动态决定属性是否序列化枚举值的自定义格式化问题自定义类型转换全局序列化设置指定序列化时......
  • 剑指 Offer II 048. 序列化与反序列化二叉树
    题目链接:剑指OfferII048.序列化与反序列化二叉树方法:先序遍历(dfs)解题思路 在先序遍历过程中,节点值之间通过空格隔开,好利于后续反序列化过程中获取值。代码classCodec{public://Encodesatreetoasinglestring.stringserialize(TreeNode*root){......