可以将 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"
            
        ]
    

我找到了很多解决方案,从SimpleModuleJsonDeserializer,但通常都适用于价值部分。如何修剪密钥本身,然后正确转换为我的 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>

Jackson 工具类使用及配置指南

Jackson忽略空字段

FastJSONGson和Jackson性能对比

可以将 Jackson 配置为从所有字符串属性中修剪前导/尾随空格吗?

java json 库之 jackson