如何从 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
我想过滤掉响应中的一些字段。过滤应该在 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