fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG]Hutool的JSONArray反序列化错误

Open markr512 opened this issue 1 year ago • 7 comments

传输对象中有JSONArray字段的属性,在反序列化后得到的对象不是原有对象,变成了config和raw

markr512 avatar Nov 02 '23 01:11 markr512

麻烦提供下复现示例代码

yanxutao89 avatar Nov 02 '23 05:11 yanxutao89

@yanxutao89 不好意思 本人能力有限,无法将dubbo中的一部分代码剥离开, 附件为能复现的main方法,我跟踪到了最后反序列化,希望能帮忙分析下具体问题,是否为fastjson2的问题,还是dubbo的问题, 多谢!!! demo.zip image

markr512 avatar Nov 03 '23 08:11 markr512

报错信息可以提供下么?

wenshao avatar Nov 05 '23 05:11 wenshao

没有报错信息 就是JSONArray中的反序列化之后得到的结果和序列化前不一致

markr512 avatar Nov 06 '23 00:11 markr512

用2.0.42试下是否还是不一样

wenshao avatar Nov 06 '23 01:11 wenshao

2.0.42还是有同样的问题

集合原值-->[BizDataDTO(pageJson=[{"colName":"title","colType":"3","viewSeq":1}])]

处理后的值-->[BizDataDTO(pageJson=[{"config":{"ignoreNullValue":true,"ignoreError":false,"ignoreCase":false,"transientSupport":true,"checkDuplicate":false,"stripTrailingZeros":true},"raw":{"colName":"title","colType":"3","viewSeq":1}}])]

处理前为一个数组,处理后变成了config和raw两个对象,raw里是数组的值

markr512 avatar Nov 07 '23 00:11 markr512

package com.example.demo;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.leoao.kefu.base.Entry;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.serialize.fastjson2.*;
import org.apache.dubbo.common.utils.SerializeCheckStatus;
import org.apache.dubbo.rpc.model.FrameworkModel;
import org.apache.dubbo.rpc.protocol.injvm.DefaultParamDeepCopyUtil;

import java.io.*;
import java.util.*;

@Slf4j
public class DemoApplication {


    /**
     * 正常情况输出一个pageJson的对象
     * 实际输出是JSONObject的config和raw
     * @param args
     */
    public static void main(String[] args) {
        Fastjson2SecurityManager manager = FrameworkModel.defaultModel().getBeanFactory().getBean(Fastjson2SecurityManager.class);
        manager.notifyCheckSerializable(false);
        manager.notifyCheckStatus(SerializeCheckStatus.DISABLE);
        URL consumerUrl =
                URL.valueOf("dubbo://127.0.0.1:8104?prefer.serialization=fastjson2",FrameworkModel.defaultModel());
        BizDataDTO p = new BizDataDTO();
        Map<String,Object> m = new HashMap<>();
        m.put("title","123");
        m.put("hahah",new Entry().setValue("hahahah"));
        p.setOutputProps(m);
        String s1 = JSON.toJSONString(p);
        BizDataDTO pj = JSONUtil.toBean(s1,BizDataDTO.class);
        JSONObject j1 = (JSONObject)pj.getOutputProps().get("hahah");
        System.out.println(j1);
        BizDataDTO copy_p = new DefaultParamDeepCopyUtil().copy(consumerUrl, pj, BizDataDTO.class);
        JSONObject j2 = (JSONObject)copy_p.getOutputProps().get("hahah");
        System.out.println(j2);
    }

    @Data
    public static class BizDataDTO implements Serializable {
        private Map<String, Object> outputProps = new HashMap<>();
    }

}

复现了 raw和config是hutool-jsonobject的内部属性 。 fastjson用反射的方式无参构造器创建了hutool-jsonobject应该有点问题 image

gg159753 avatar Jan 25 '24 10:01 gg159753