This repository has been archived by the owner on Aug 20, 2021. It is now read-only.
json toBean传入参数首字母为大写时转化的值为空的问题 #509
Comments
在网上找了之后发现,在将json转换为CrmMemberInfoCommand 对象在初始化JsonConfig的时候,需要设置JsonConfig的JavaIdentifierTransformer属性并重写JavaIdentifierTransformer对象的transformToJavaIdentifier方法,将每个参数名称首字母改为小写,事例代码如下:
输出
|
写了一个版本 @Test
public void testToBean2(){
String json = "{'MemberNo':'11105000009','Name':null,'Gender':'','Phone':'15036334567','Email':null,'Birthday':''}";
JsonToJavaConfig jsonToJavaConfig = new JsonToJavaConfig();
jsonToJavaConfig.setRootClass(CrmMemberInfoCommand.class);
jsonToJavaConfig.setJavaIdentifierTransformer(UncapitalizeJavaIdentifierTransformer.UNCAPITALIZE);
CrmMemberInfoCommand crmMemberInfoCommand = JsonUtil.toBean(json, jsonToJavaConfig);
LOGGER.debug(JsonUtil.format(crmMemberInfoCommand));
} 当然,也提供了便捷的构造函数 ,一行代码搞定 String json = "{'MemberNo':'11105000009','Name':null,'Gender':'','Phone':'15036334567','Email':null,'Birthday':''}";
CrmMemberInfoCommand crmMemberInfoCommand = JsonUtil.toBean(json, new JsonToJavaConfig(CrmMemberInfoCommand.class, UNCAPITALIZE)); |
上述都是 java to json 的方法 ,此处可以不使用 feilong 重新修订了方法名称 com.feilong.tools.jsonlib.JsonHelper.buildDefaultJavaToJsonConfig() /**
* 默认的java to json JsonConfig.
*
* <h3>含有以下的特性:</h3>
* <blockquote>
* <ol>
* <li>{@link CycleDetectionStrategy#LENIENT} 避免循环引用</li>
* <li>no IgnoreDefaultExcludes,默认过滤几个key "class", "declaringClass","metaClass"</li>
* <li>
* {@link DateJsonValueProcessor},如果是日期,自动渲染成 {@link DatePattern#COMMON_DATE_AND_TIME} 格式类型,如有需要可以使用
* {@link JavaToJsonConfig#setPropertyNameAndJsonValueProcessorMap(Map)}覆盖此属性
* </li>
* <li>AllowNonStringKeys,允许非 string类型的key</li>
* </ol>
* </blockquote>
*
* @return the default json config
* @see see net.sf.json.JsonConfig#DEFAULT_EXCLUDES
* @see net.sf.json.util.CycleDetectionStrategy#LENIENT
*
* @see <a href="http://feitianbenyue.iteye.com/blog/2046877">通过setAllowNonStringKeys解决java.lang.ClassCastException: JSON keys must be
* strings</a>
*/
static JsonConfig buildDefaultJavaToJsonConfig(){
JsonConfig jsonConfig = new JsonConfig();
//see net.sf.json.JsonConfig#DEFAULT_EXCLUDES
//默认会过滤的几个key "class", "declaringClass","metaClass"
jsonConfig.setIgnoreDefaultExcludes(false);
// java.lang.ClassCastException: JSON keys must be strings
// see http://feitianbenyue.iteye.com/blog/2046877
jsonConfig.setAllowNonStringKeys(true);
//排除,避免循环引用 There is a cycle in the hierarchy!
//Returns empty array and null object
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
// 注册日期处理器
jsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor(COMMON_DATE_AND_TIME));
return jsonConfig;
} |
单元测试 @Test
public void testToBeanWithUncapitalizeJavaIdentifierTransformer(){
String json = "{'MemberNo':'11105000009','Name':null,'Gender':'','Phone':'15036334567','Email':null,'Birthday':''}";
CrmMemberInfoCommand crmMemberInfoCommand = JsonUtil.toBean(json, new JsonToJavaConfig(CrmMemberInfoCommand.class, UNCAPITALIZE));
assertThat(crmMemberInfoCommand, allOf(//
hasProperty("memberNo", is("11105000009")),
hasProperty("name", is(nullValue())),
hasProperty("gender", is("")),
hasProperty("phone", is("15036334567")),
hasProperty("email", is(nullValue())),
hasProperty("birthday", is(""))
//
));
} |
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
在和第三方对接的时候,对方给到的参数是json格式的,但是json字符串中每个参数的名称首字母是大写的,json字符串和实体类如下:
直接使用@venusdrogon feilong jar中的JsonUtil.toBean(Object json,Class rootClass);
会抛出异常,例如
The text was updated successfully, but these errors were encountered: