fastjson2
fastjson2 copied to clipboard
[BUG]Hutool的JSONArray反序列化错误
传输对象中有JSONArray字段的属性,在反序列化后得到的对象不是原有对象,变成了config和raw
麻烦提供下复现示例代码
@yanxutao89 不好意思 本人能力有限,无法将dubbo中的一部分代码剥离开,
附件为能复现的main方法,我跟踪到了最后反序列化,希望能帮忙分析下具体问题,是否为fastjson2的问题,还是dubbo的问题,
多谢!!!
demo.zip
报错信息可以提供下么?
没有报错信息 就是JSONArray中的反序列化之后得到的结果和序列化前不一致
用2.0.42试下是否还是不一样
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里是数组的值
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应该有点问题