在把java对象转换为json时,有时需要依据需求动态过滤掉一些属性,比如使用注解形式过滤,这样是静态的。jackjson提供了这种动态过滤的。代码如下
import java.io.Writer;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.DeserializationConfig.Feature;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.introspect.AnnotatedClass;
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;
import org.codehaus.jackson.map.ser.FilterProvider;
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
import org.codehaus.jackson.type.JavaType;
import org.slf4j.Logger;
import com.maowu.commons.logutil.LogProxy;
public class JsonConverter
{
private static final Logger log = LogProxy.getLogger(JsonConverter.class);
public static final ObjectMapper mapper = new ObjectMapper();
static
{
// 序列化时候,只序列化非空字段
mapper.setSerializationConfig(mapper.getSerializationConfig().withSerializationInclusion(
JsonSerialize.Inclusion.NON_NULL));
// 当范序列化出现未定义字段时候,不出现错误
DeserializationConfig deserializationConfig = mapper.getDeserializationConfig();
deserializationConfig = deserializationConfig.without(Feature.FAIL_ON_UNKNOWN_PROPERTIES,
Feature.FAIL_ON_NULL_FOR_PRIMITIVES);
deserializationConfig = deserializationConfig.with(Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT,
Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
mapper.setDeserializationConfig(deserializationConfig);
}
public static String format(Object obj)
{
try
{
return mapper.writeValueAsString(obj);
}
catch (Exception e)
{
log.debug("format obj failure.obj=" + obj);
throw new RuntimeException("JsonUtil.format error:" + obj, e);
}
}
public static void outputToWriter(Writer out, Object value)
{
try
{
mapper.writeValue(out, value);
}
catch (Exception e)
{
log.error("JsonUtil.outputToWriter error:" + value, e);
throw new RuntimeException("JsonUtil.outputToWriter error:" + value, e);
}
}
public static <T> T parse(JsonNode body, Class<T> clz)
{
try
{
return mapper.readValue(body, clz);
}
catch (Exception e)
{
log.error("JsonUtil.parse [" + clz + "]:" + body, e);
throw new RuntimeException("JsonUtil.parse [" + clz + "]:" + body, e);
}
}
public static <T> T parse(String str, Class<T> clz)
{
try
{
return mapper.readValue(str == null ? "{}" : str, clz);
}
catch (Exception e)
{
log.error("JsonUtil.parse [" + clz + "]:" + str, e);
throw new RuntimeException("JsonUtil.parse [" + clz + "]:" + str, e);
}
}
public static <T> T parseList(String str, Class<?> clz, Class<?> type)
{
try
{
JavaType javaType = mapper.getTypeFactory().constructParametricType(clz, type);
return mapper.readValue(str, javaType);
}
catch (Exception e)
{
log.error("JsonUtil.parse [" + clz + "]:" + str, e);
throw new RuntimeException("JsonUtil.parse [" + clz + "]:" + str, e);
}
}
public static JsonNode tree(Object obj)
{
try
{
return mapper.valueToTree(obj);
}
catch (Exception e)
{
log.debug("format obj failure.obj=" + obj);
throw new RuntimeException("JsonUtil.format error:" + obj, e);
}
}
public static String serializeAllExcept(Object obj, String... filterFields)
{
try
{
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationConfig(mapper.getSerializationConfig().withSerializationInclusion(
JsonSerialize.Inclusion.NON_NULL));
FilterProvider filters = new SimpleFilterProvider().addFilter(obj.getClass().getName(),
SimpleBeanPropertyFilter.serializeAllExcept(filterFields));
mapper.setFilters(filters);
mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector()
{
@Override
public Object findFilterId(AnnotatedClass ac)
{
return ac.getName();
}
});
return mapper.writeValueAsString(obj);
}
catch (Exception e)
{
log.debug("format obj failure.obj=" + obj);
throw new RuntimeException("Json.format error:" + obj, e);
}
}
public static String filterOutAllExcept(Object obj, String... filterFields)
{
try
{
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationConfig(mapper.getSerializationConfig().withSerializationInclusion(
JsonSerialize.Inclusion.NON_NULL));
FilterProvider filters = new SimpleFilterProvider().addFilter(obj.getClass().getName(),
SimpleBeanPropertyFilter.filterOutAllExcept(filterFields));
mapper.setFilters(filters);
mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector()
{
@Override
public Object findFilterId(AnnotatedClass ac)
{
return ac.getName();
}
});
return mapper.writeValueAsString(obj);
}
catch (Exception e)
{
log.debug("format obj failure.obj=" + obj);
throw new RuntimeException("Json.format error:" + obj, e);
}
}
}
相关推荐
jackson工具类有动态属性过虑功能.在业务应用中经常会有指定属性序列化json的需求,
杰克逊动态属性过滤器基本上,当您使用Gson时,需要从目标对象上的序列化WITHOUT批注中排除特定字段,您将使用ExclusionStrategy 。 但是我在杰克逊没有找到类似的方法来做到这一点。 因此,此存储库提供了一种动态...
Jackson动态属性过滤器-Spring Boot Starter 用于Spring Boot Starter,它提供了一种简便的方法,可以通过动态确定过滤,而无需直接在Java对象上编写注释,并且还可以与Spring MVC / Spring Boot很好地集成。 先决...
`@JsonIgnore`是Jackson库提供的一种标准方式来过滤属性,但有时候我们可能需要更精细的控制,比如根据特定条件决定是否忽略某个属性。这时,自定义注解就显得尤为重要。 首先,我们需要创建一个自定义注解,例如...
Jackson还支持更高级的功能,如处理复杂类型(如嵌套对象、集合、泛型),处理日期和时间,自定义序列化和反序列化逻辑,以及使用`JsonView`进行数据过滤等。此外,对于大型项目,可以通过配置`ObjectMapper`实例来...
- **POJO(Plain Old Java Object)映射**:Jackson可以直接将JSON映射到Java类的实例上,无需额外的配置,只要类的属性和JSON键匹配即可。 - **数据过滤和忽略**:通过注解如`@JsonIgnore`,可以控制哪些字段不参与...
通过这种方式,我们实现了通过自定义注解动态过滤JSON字段的功能,使得后端开发人员能够更灵活地控制返回给客户端的数据,提高系统的安全性。这种技术尤其适用于那些具有大量API且需要对返回数据进行精细控制的项目...
在某些情况下,为了保持数据的整洁和避免后端处理null值时出现异常,我们需要在数据传输前过滤掉这些null值。本教程将详细介绍如何使用Spring MVC的拦截器来实现这一功能。 首先,了解拦截器(Interceptor)在...
这种语法使得过滤规则易于理解和实现,特别适合于动态或者条件性的属性筛选。 在实际使用中,你需要首先在项目中引入Jackson库和Java_squigly Filter的相关依赖。接着,你可以创建一个`SimpleBeanPropertyFilter`...
我们的POJO使用@JsonView注解属性传递已经定义的视图。在Spring的Controller我们可以使用Jackson的@JsonView注解我们的方法。序列化Http响应体的时候,JSON响应将在配置视图的基础上进行过滤。我们也可以在Spring ...
杰克逊·贾克斯(Jackson-Jaxrs)属性过滤 概述 用于启用自动过滤来自JAX-RS端点的JSON响应的库。 客户端通过查询参数指定他们想要的属性,并且库负责将响应实体过滤为仅这些属性(请参见的示例)。 经过Jersey测试...
5. **配置选项**:Jackson提供了大量配置选项,例如日期格式化、自定义序列化和反序列化行为、忽略未知属性等。 6. **与其他框架集成**:Jackson可以轻松地与Spring、Hibernate等框架集成,实现JSON数据的自动转换...
@JsonIgnoreProperties 注解用于忽略该字段所包含的全部属性。 7. @JsonInclude 注解 @JsonInclude 注解用于指定该字段的序列化方式。例如,我们可以使用 @JsonInclude(Include.NON_EMPTY) 来指定该字段仅在不为空...
- 另外,也可以通过全局配置`ObjectMapper`,启用`HtmlEscapingEnabled`属性,使Jackson在序列化时自动转义HTML。 4. **其他解决方案**: - 如果你使用的是Thymeleaf等模板引擎,它们通常会自动转义输出内容,...
在这个文档中,我们将重点讨论三个关键注解:`@JsonIgnore`, `@JsonFormat`, 和 `@JsonProperty`,以及如何使用 `JsonFilter` 实现动态数据列过滤。 `@JsonIgnore` 是一个非常实用的注解,当它被应用于一个属性上时...
`JsonConfig`是Jackson或Fastjson等库中的配置类,可以通过设置`exclusions`来排除特定属性。例如,将`address`属性加入排除列表,防止在序列化时处理。但要注意,这种方法会全局影响所有包含该属性的类。 3. **...
可以使用诸如Gson或Jackson这样的库将Java对象转化为JSON字符串。例如: ```java import com.google.gson.Gson; ... public String execute() { List<DataModel> dataList = ...; // 获取数据 Gson gson = new...
spring-mvc-Json动态忽略目的 : 有时,过滤序列化到 HTTP 响应主体的上下文对象会很有用。在某些情况下,返回的部分数据可能对使用 API 的设备没有用,或者应该对公众保持不可见,因此不应该t 通过 JSON 序列化和...
1. **信任边界**:当系统接收来自不可信源的序列化数据时,如果没有正确的验证和过滤,就可能遭受攻击。 2. **脆弱的自定义序列化**:在`readObject`方法中直接执行未经验证的用户输入,可能导致代码执行。 3. **...
首先,Spring Boot默认使用的JSON库是Jackson,它提供了强大的JSON序列化和反序列化功能。为了去除JSON中的`null`值和空字符串,我们可以通过自定义Jackson配置来实现。以下是一个简单的配置类`JacksonConfig`示例:...