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があればエラーは発生しない.