这个问题,困惑我很久了。
总结:类的字段个数一定要大于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就不会出错。