[alibaba/fastjson]修复JavaBeanDeserializer进行JSON解析时未能正确识别value已是Json字符串

2023-12-15 482 views
6
PR说明

修复JavaBeanDeserializer进行JSON解析时未能正确识别value已是Json字符串,而再次toJSONString()导致的解析错误。

测试用例

已通过测试用例验证,代码位于:src/test/java/com/alibaba/fastjson/deserializer/javabean/JavaBeanConvertTest.java

回答

2

json 串里套了个字符串, 不符合规范

6

Map转JavaBean,目前测试了如下异常:

Map中Value为String类型的JSON字符串,转换List<JSONObject>异常
Map中Value为String类型的字符串,转换枚举异常
Map中Value为Character类型的字符,转换Character异常

暂时通过如下方式实现成功转换:

                if (fieldInfo.declaringClass != null
                        && ((!fieldClass.isInstance(value))
                            || (fieldAnnation != null && fieldAnnation.deserializeUsing() != Void.class))
                ) {
//                    DefaultJSONParser parser = new DefaultJSONParser(JSON.toJSONString(value));
                    if (fieldInfo.isEnum || fieldClass == Character.class) {
                        value = TypeUtils.cast(value, paramType, config);
                        fieldDeser.setValue(object, value);
                    } else {
                        String input = value instanceof String ? (String) value : JSON.toJSONString(value);
                        DefaultJSONParser parser = new DefaultJSONParser(input);
                        fieldDeser.parseField(parser, object, paramType, null);
                    }

                    continue;
                }

是否可以在 fieldDeser.parseField(parser, object, paramType, null) 异常之后通过 TypeUtils.cast(value, paramType, config) 转换

7
        paramJson.put("jsonObject", jsonObject.toJSONString());
        paramJson.put("jsonArray", jsonArray.toJSONString());
        paramJson.put("jsonObjectList", jsonArray.toJSONString());
修改为
        paramJson.put("jsonObject", jsonObject);
        paramJson.put("jsonArray", jsonArray);
        paramJson.put("jsonObjectList", jsonArray);
4

@timandy 已添加JSON对象转JSON对象测试

源码变更如下(被注释掉的代码为未更改之前的代码):

                if (fieldInfo.declaringClass != null
                        && ((!fieldClass.isInstance(value))
                            || (fieldAnnation != null && fieldAnnation.deserializeUsing() != Void.class))
                ) {
//                    DefaultJSONParser parser = new DefaultJSONParser(JSON.toJSONString(value));
                    String input;
                    if (value instanceof String && JSONValidator.fromUtf8(((String) value).getBytes()).validate()) {
                        input = (String) value;
                    } else {
                        input = JSON.toJSONString(value);
                    }

                    DefaultJSONParser parser = new DefaultJSONParser(input);
                    fieldDeser.parseField(parser, object, paramType, null);

                    continue;
                }