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 時應避免此類操作。