繁体   English   中英

如何从 JSON 字段名称中获取 Java 的对象字段名称

[英]How to get Java's object field's name from JSON fields name

我想过滤掉响应中的一些字段。 过滤应在 Java 对象序列化为 JSON 之前完成。 考虑:

public class Entity {

    @JsonProperty("some_property")
    String someProperty;

    @JsonProperty("nested_entity")
    @OneToMany(mappedBy = "entity", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    NestedEntity nestedEntity;

    // other fields for eg fieldA, fieldB
}

API 端点

get api/entity/{id}?fields=some_property,field_a

现在的问题是,在 o/p 中,我们应该只过滤掉 someProperty 和 fieldA。 喜欢

{
    "some_property": "foo",
    "field_a": "bar"
}

但是由于这些是 JSON 字段而不是 Java 对象字段,我无法通过反射过滤或获取这些字段。 有没有办法实现这一点,即基于 json 字段过滤 Java 对象?

仅供参考:在序列化之前过滤的优点是,除非需要这些字段,否则会保存惰性字段的数据库调用

提前致谢!

根据@robocode 的建议使用@JsonFilter并支持空fields或无字段过滤添加了 JacksonConfiguration

@JsonFilter("entityFilter")
public class Entity {

    @JsonProperty("some_property")
    String someProperty;
    // other fields for eg fieldA, fieldB
}

@Configuration
public class JacksonConfiguration { 
    public JacksonConfiguration(ObjectMapper objectMapper) {
        objectMapper.setFilterProvider(new SimpleFilterProvider().setFailOnUnknownId(false));
    } 
}

public class FieldMapper {
    
    @SneakyThrows
    public static Dto getFilteredFields(Dto make, String fields[]) {
        ObjectMapper objectMapper = new ObjectMapper();
        if(ArrayUtils.isNotEmpty(fields)) {
            FilterProvider filters = new SimpleFilterProvider().addFilter(
                    "entityFilter", SimpleBeanPropertyFilter.filterOutAllExcept(fields)
            );
            objectMapper.setFilterProvider(filters);
        } else {
            objectMapper.setFilterProvider(new SimpleFilterProvider().setFailOnUnknownId(false));
        }
        JsonNode j = objectMapper.readTree(objectMapper.writeValueAsString(make));
        return objectMapper.convertValue(j, Dto.class);
    }
}

// controller code to get the dto for api/entity/{id}?fields=some_property,field_a
Dto filteredFields = getFilteredFields(dto, fields);
return filteredFields

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM