使用 ((JSONObject) objs).toJavaObject(bean.getClass()); 其中bean里含有字符Character类型的属性成员,为什么抛出以下异常? can not cast to : java.lang.Character 是我的json串的问题还是包的问题?帮确定下。 版本1.2.32
[alibaba/fastjson]Json对象不能转bean含有字符类型成员
回答
增加测试用例
定义bean:
public class TestBean { private String name; private Character sex; private Integer age; private Double money; get(),set()... }
测试转换:
`
TestBean tb = new TestBean();
tb.setName("zs");
tb.setSex('M');
tb.setAge(20);
tb.setMoney(100.5d);
try {
String jsonStr = JSON.toJSONString(tb);
System.out.println(jsonStr);
TestBean tb2 = JSON.parseObject(jsonStr).toJavaObject(tb.getClass());
System.out.println(tb2.toString());
} catch (Exception e) {
e.printStackTrace();
}
`
输出: {"age":20,"money":100.5,"name":"zs","sex":"M"} com.alibaba.fastjson.JSONException: can not cast to : java.lang.Character at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1052) at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:689) at com.alibaba.fastjson.JSON.toJavaObject(JSON.java:961) at yxerp.Test.main(Test.java:23) Caused by: com.alibaba.fastjson.JSONException: can not cast to : java.lang.Character at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:818) at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:868) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:1010) at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1050) ... 3 more
string转char的问题,加个特殊处理即可
JSON.parseObject(jsonStr).toJavaObject(tb.getClass()); 这一句改成 JSON.parseObject(jsonStr,tb.getClass()); 即可
查了一下history,发现从最开始的版本中TypeUtils里p730如下代码被注释: if (clazz == char.class || clazz == Character.class) { return (T) castToChar(obj); } 放开这段注释即可。
已PR+testcase: #1238
@wenshao
@zxw0558 可以close了
@kimmking 后续可以尝试下在pull request的时候 commit messages 加上 fixed #1226,当这次pr merge后会自动关闭关联的issue.
https://help.github.com/articles/closing-issues-via-commit-messages/
收到 @wuwen5