可以将 Jackson 配置为反序列化 JSON 密钥(非值)吗?
Posted
技术标签:
【中文标题】可以将 Jackson 配置为反序列化 JSON 密钥(非值)吗?【英文标题】:Can Jackson be configured to deserialize the JSON Key (Not value)? 【发布时间】:2021-05-18 08:52:57 【问题描述】:我正在尝试修剪 JSON key
以避免 JSON 请求中的空格。
JSON 对象看起来像带有空格,(检查“eq”)
"page": 0,
"size": 25,
"and":
"eq ": [
"field":"id",
"value": "60536"
]
我找到了很多解决方案,从SimpleModule
到JsonDeserializer
,但通常都适用于价值部分。如何修剪密钥本身,然后正确转换为我的 Java POJO?
public class SearchInDTO implements InDTO
private Integer pageNo;
private Integer pageSize;
private ANDFilter andFilter;
@JsonProperty("page")
public Integer getPageNo()
return pageNo;
public void setPageNo(Integer pageNo)
this.pageNo = pageNo;
@JsonProperty("size")
public Integer getPageSize()
return pageSize;
public void setPageSize(Integer pageSize)
this.pageSize = pageSize;
@JsonProperty("and")
public ANDFilter getAndFilter()
return andFilter;
public void setAndFilter(ANDFilter andFilter)
this.andFilter = andFilter;
public static class EQFilter extends FieldValue
@JsonProperty("field")
public String getFieldName()
return super.getFieldName();
@JsonProperty("value")
public String getValue()
return super.getValue();
@Override
public String toString()
final StringBuilder sb = new StringBuilder("EQFilter");
sb.append(super.toString());
sb.append('');
return sb.toString();
public static class FieldValue
private String fieldName;
private String value;
@JsonProperty("field")
public String getFieldName()
return fieldName;
public void setFieldName(String fieldName)
this.fieldName = fieldName;
@JsonProperty("value")
public String getValue()
if(value == null) return value;
return value.toLowerCase();
public void setValue(String value)
this.value = value;
public static class ANDFilter
private List<EQFilter> eqFilters = new ArrayList<>();
@JsonProperty("eq")
public List<EQFilter> getEqFilters()
return eqFilters;
public void setEqFilters(List<EQFilter> eqFilters)
this.eqFilters = eqFilters;
【问题讨论】:
也许这篇文章是一个好的开始:medium.com/@svchaibasa/… 【参考方案1】:使用自定义 JsonParser 实现的解决方案:
public class MyJsonParser extends JsonParserDelegate
public MyJsonParser(JsonParser parser)
super(parser);
@Override
public String getCurrentName() throws IOException
return super.getCurrentName().trim();
public class MyJsonParserFactory extends MappingJsonFactory
@Override
protected JsonParser _createParser(InputStream in, IOContext ctxt) throws IOException
return new MyJsonParser(super._createParser(in, ctxt));
@Override
protected JsonParser _createParser(Reader r, IOContext ctxt) throws IOException
return new MyJsonParser(super._createParser(r, ctxt));
@Override
protected JsonParser _createParser(char[] data, int offset, int len, IOContext ctxt, boolean recyclable) throws IOException
return new MyJsonParser(super._createParser(data, offset, len, ctxt, recyclable));
@Override
protected JsonParser _createParser(byte[] data, int offset, int len, IOContext ctxt) throws IOException
return new MyJsonParser(super._createParser(data, offset, len, ctxt));
@Override
protected JsonParser _createParser(DataInput input, IOContext ctxt) throws IOException
return new MyJsonParser(super._createParser(input, ctxt));
@Component
public class MyJackson2ObjectMapperBuilderCustomizer implements Jackson2ObjectMapperBuilderCustomizer
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder)
jacksonObjectMapperBuilder.factory(new MyJsonParserFactory());
【讨论】:
以上是关于可以将 Jackson 配置为反序列化 JSON 密钥(非值)吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jackson 将 JSON 反序列化为 ArrayList<POJO>