jackson逆シーケンス化フィールド数

4546 ワード


この問題は長い間困惑していた.
 
まとめ:クラスのフィールド数は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 + "]";
	}
}

 
 
Junit 1のコードを観察すると、注釈で述べたようにtargetJson_success、targetJson_normalのjson列はすべて逆シーケンス化に成功したがtargetJson_failedは失敗した.
 
なぜなら私が言ったようにtargetJsonsuccessは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という文字列はインタフェースで返され、flgとmsgの2つのパラメータを含む必要があります.
 
成功した場合はパラメータを追加します:data
失敗する場合はdataパラメータがない.
 
したがって,クラスにflgとmsgがあればエラーは発生しない.