jackson 反序列化 字段个数

这个问题,困惑我很久了。

总结:类的字段个数一定要大于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:

扫描二维码关注公众号,回复: 780933 查看本文章
/**
 * 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就不会出错。

 

猜你喜欢

转载自wandejun1012.iteye.com/blog/2235592