这个问题,困惑我很久了。
总结:类的字段个数一定要大于json串的字段个数,否则反序列化失败。
Demo1:
Junit1:
@Test
public void testJsonRead(){
//1.构造目标Json
String targetJson_success = "{\"l\":1,\"m\":2}";
// String targetJson_failed = "{\"l\":1,\"m\":2,\"r\":3,\"g\":4}";
// String targetJson_normal = "{\"l\":1,\"m\":2,\"r\":3}";
//2.构造目标 Java Bean
MyTriple mt=JsonMapper.getDefault().readValue(targetJson_success,
MyTriple.class);
System.out.println(mt);
}
类MyTrilple:
/**
* Copyright (c) 2009-2015. 上海诺诺镑客 All rights reserved.
* @(#) MyTriple.java 2015年4月23日 下午2:55:24
*/
package com.nonobank.common.domain;
/**
* @FileName: MyTriple.java
* @Function:TODO
* @date: 2015年4月23日 下午2:55:24
* @author: wandejun
* @since JDK 1.8
*/
public class MyTriple {
Short l;
Integer m;
Long r;
public Short getL() {
return l;
}
public void setL(Short l) {
this.l = l;
}
public Integer getM() {
return m;
}
public void setM(Integer m) {
this.m = m;
}
public Long getR() {
return r;
}
public void setR(Long r) {
this.r = r;
}
@Override
public String toString() {
return "MyTriple [l=" + l + ", m=" + m + ", r=" + r + "]";
}
}
观察Junit1的那个代码,正如注释所说的一样,targetJson_success、targetJson_normal的json串全部可以反序列化成功,但是targetJson_failed就是失败的。
原因就是我上面所说的,targetJson_success是2个参数,分别是l,m,而MyTriple类中是3个参数l,m,r
那么3>=2,所以targetJson_success是可以的。
而targetJson_failed是4个参数,分别是l,m,r,r而MyTriple类中是3个参数l,m,r
那么3<=4,所以targetJson_failed是不可以的。
---------------------------------------------------------------------------------------------------
Demo2:
转化类:
/**
*
* @Title: getStudentInfoBySessionId
* @Description:根据sessionId从memchache中获取用户信息
* @param sessionId
* @return
* @Return: Map<String,String>
*
*/
public MicroPHPResult getStudentInfoBySessionId(String sessionId) {
MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
form.add("sessionId", sessionId);
String microPhpUrl = DefaultWebAppConfigure.getConfigure().getMicroPhpUrl();
String phpResp = restTemplate.postForObject(microPhpUrl + "user/getSessionData", form, String.class);
if (phpResp == null) {
LOG.error("根据sessionId获取用户信息超时.");
return null;
}
MicroPHPResult result = readJsonValue(phpResp, MicroPHPResult.class);
return result;
}
类MicroPHPResult:
package com.nonobank.web.web.controller.credit.bean;
public class MicroPHPResult {
private String flag;
private String msg;
private UserInfoData data;
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
public UserInfoData getData() {
return data;
}
public void setData(UserInfoData data) {
this.data = data;
}
@Override
public String toString() {
return "MicroPHPResult [flag=" + flag + ", data=" + data
+ ", getFlag()=" + getFlag() + ", getData()=" + getData()
+ ", getClass()=" + getClass() + ", hashCode()=" + hashCode()
+ ", toString()=" + super.toString() + "]";
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
注意到:phpResp这个字符串是接口返回的,它必须包含2个参数,一个是flg,一个是msg.
在成功的情况下会追加参数:data
在失败的情况下则没有data参数.
因此,只要类中有flg和msg就不会出错。