FastJson 1.2.48的 bug

FastJson 新版1.2.48版的 bug

fastjson bug 老有莫名的 bug 出現,如下代碼:    

 @Test
    public void testJsonParser() throws IOException {
        InnerTemplateExecuteContext ctx=new InnerTemplateExecuteContext();
        ctx.setAppName("ecc");
        ctx.setWfDefName("complain_wf");
        ctx.setVersion(9);
        ctx.setTaskRefName("wait_for_complain2");
        List<String> taskRefNames=new ArrayList<>();
        taskRefNames.add("wait_for_complain2");
        ctx.setTaskRefNames(taskRefNames);
        Map<String,Object> taskInputParameters=new HashMap<>();
        taskInputParameters.put("_SCHEDULE_OFFSET_TIME", 0);
        ctx.setTaskInputParameters(taskInputParameters);
        InnerTemplateExecuteContext parentExecuteContext=new InnerTemplateExecuteContext();
        parentExecuteContext.setAppName("ecc");
        parentExecuteContext.setWfDefName("dacuweidan");
        parentExecuteContext.setVersion(1);
        parentExecuteContext.setTaskRefName("complain_wf");
        List<String> ptaskRefNames2=new ArrayList<>();
        ptaskRefNames2.add("complain_wf");
        parentExecuteContext.setTaskRefNames(ptaskRefNames2);
        
        Map<String,Object> inputParameters=new HashMap<>();
        inputParameters.put("traceId", "0bb9fbbe15269897127234789d07d8");
        inputParameters.put("rpcId", 9);
        Map<String,Object> context=new HashMap<>();
        context.put("eccTraceOrder", "dfdf");
        context.put("eccTraceOrderDynamicFeatureMap", "rrrrrr");
        inputParameters.put("context", context);
        inputParameters.put("_--_executeContext", parentExecuteContext);
        inputParameters.put("_--_drivesource", "UserAppoint");
        ctx.setParentExecuteContext(parentExecuteContext);
        ctx.setInputParameters(inputParameters);
        String json=JSON.toJSONString(ctx);
        InnerTemplateExecuteContext context2=JSON.parseObject(json, InnerTemplateExecuteContext.class);
        System.out.println(context2.toString());
       }

同一個對象中的子對象出現在父對象中的 map 和本身屬性中都出現時,FastJson 爲了減小字符串長度,轉換後使用$ref 代替,生成 json 如下:   

{
	"appName": "ecc",
	"inputParameters": {
		"traceId": "0bb9fbbe15269897127234789d07d8",
		"_--_executeContext": {
			"appName": "ecc",
			"taskRefName": "complain_wf",
			"taskRefNames": ["complain_wf"],
			"version": 1,
			"wfDefName": "dacuweidan"
		},
		"context": {
			"eccTraceOrder": "dfdf",
			"eccTraceOrderDynamicFeatureMap": "rrrrrr"
		},
		"rpcId": 9,
		"_--_drivesource": "UserAppoint"
	},
	"parentExecuteContext": {
		"$ref": "$.inputParameters._--_executeContext"
	},
	"taskInputParameters": {
		"_SCHEDULE_OFFSET_TIME": 0
	},
	"taskRefName": "wait_for_complain2",
	"taskRefNames": ["wait_for_complain2"],
	"version": 9,
	"wfDefName": "complain_wf"
}

將該 json 字符串反序列化爲 json 時候,

"$ref": "$.inputParameters._--_executeContext" 

此字符串沒法成功轉換,報

com.alibaba.fastjson.JSONException: com.alibaba.fastjson.JSONObject cannot be cast to com.cainiao.middleware.drama.model.ctx.InnerTemplateExecuteContext

轉換異常,使用 fastjson 時應避免此類操作。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章