Fastjson 是阿里巴巴开源的高性能 JSON 处理库,它提供了简单易用的方法来序列化和反序列化 Java 对象,有时我们需要对对象的某些属性进行自定义序列化,以满足特定的业务需求,以下是关于 Fastjson 自定义序列化的详细回答:
Fastjson 自定义序列化方法
1. 使用序列化属性SerializerFeature
SerializerFeature
是 Fastjson 提供的一种简便方式,用于控制序列化的输出格式和特性,常用的SerializerFeature
属性包括:
名称 | 含义 |
WriteNonStringKeyAsString | key 不为 String,则转换为 String |
WriteNonStringValueAsString | value 不为 String,则转换为 String |
WriteMapNullValue | 输出为空的字段 |
WriteNullStringAsEmpty | String 为 null 时输出 “” |
WriteNullNumberAsZero | number 为 null 时输出 0 |
WriteDateUseDateFormat | 修改日期格式(如 “yyyy-MM-dd”) |
示例代码:
User user = new User(); user.setId(1000); user.setName("Java碎碎念"); user.setCreateDate(new Date()); Map<Integer, Integer> datamap = new HashMap<>(); datamap.put(1, 100); datamap.put(2, 200); user.setDataMap(datamap); System.out.println("默认序列化结果: " + JSON.toJSONString(user)); System.out.println("指定WriteNonStringKeyAsString序列化结果: " + JSON.toJSONString(user, SerializerFeature.WriteNonStringKeyAsString)); System.out.println("指定WriteNonStringValueAsString序列化结果: " + JSON.toJSONString(user, SerializerFeature.WriteNonStringValueAsString)); System.out.println("指定WriteMapNullValue序列化结果: " + JSON.toJSONString(user, SerializerFeature.WriteMapNullValue)); System.out.println("指定WriteNullStringAsEmpty序列化结果: " + JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty)); System.out.println("指定WriteNullNumberAsZero序列化结果: " + JSON.toJSONString(user, SerializerFeature.WriteNullNumberAsZero)); System.out.println("指定WriteDateUseDateFormat序列化结果: " + JSON.toJSONString(user, SerializerFeature.WriteDateUseDateFormat));
运行结果将展示不同SerializerFeature
选项下的序列化效果。
2. 使用PropertyFilter
通过实现PropertyFilter
接口,我们可以在序列化过程中动态地控制哪些属性需要被序列化,我们可以创建一个CustomPropertyFilter
类来过滤掉不希望序列化的属性:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.PropertyFilter; public class User { private String username; private String password; public User(String username, String password) { this.username = username; this.password = password; } // Getters and Setters omitted for brevity } class CustomPropertyFilter implements PropertyFilter { @Override public boolean apply(Object object, String name, Object value) { return !"password".equals(name); // 不序列化 password 属性 } } public class Main { public static void main(String[] args) { User user = new User("Alice", "secret123"); PropertyFilter filter = new CustomPropertyFilter(); String jsonString = JSON.toJSONString(user, filter); System.out.println(jsonString); // 输出: {"username":"Alice"} } }
在这个例子中,我们创建了一个User
类,其中包含username
和password
两个属性,接着我们实现了一个CustomPropertyFilter
,用来过滤出不希望序列化的password
属性,在main
方法中,我们通过JSON.toJSONString
方法进行序列化,并应用我们自定义的过滤器,最终我们可以看到输出中并没有包含password
属性。
3. 使用@JSONField
注解
Fastjson 允许通过@JSONField
注解的serializeUsing
属性来指定一个自定义的序列化器,对于一个模型中的特定字段,我们可以定义一个自定义的序列化器来改变其序列化行为:
import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.serializer.ObjectSerializer; import java.io.IOException; import java.lang.reflect.Type; public class Model { @JSONField(serializeUsing = ModelValueSerializer.class) public int money; } public static class ModelValueSerializer implements ObjectSerializer { @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { Integer value = (Integer) object; String text = value + "元"; serializer.write(text); } }
在这个例子中,ModelValueSerializer
类实现了ObjectSerializer
接口,覆盖了write
方法来定义money
字段的序列化逻辑,通过@JSONField
注解的serializeUsing
属性指定了使用ModelValueSerializer
作为money
字段的序列化器。
4. 实现ObjectSerializer
接口
除了使用注解外,我们还可以直接实现ObjectSerializer
接口来创建一个序列化器:
import com.alibaba.fastjson.serializer.ObjectSerializer; import java.io.IOException; import java.lang.reflect.Type; public static class CustomSerializer implements ObjectSerializer { @Override public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { // 自定义序列化逻辑 } }
通过SerializeConfig
将这个序列化器应用到特定的类上:
import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializerFeature; SerializeConfig config = new SerializeConfig(); config.put(CustomObject.class, new CustomSerializer()); String jsonString = JSON.toJSONString(customObject, config);
相关问答 FAQs
问题1: Fastjson 如何实现自定义序列化?
答:Fastjson 可以通过多种方式实现自定义序列化,包括使用序列化属性SerializerFeature
、实现PropertyFilter
接口、使用@JSONField
注解以及实现ObjectSerializer
接口等,具体方法取决于实际的业务需求和场景。
问题2: Fastjson 中如何过滤不需要序列化的字段?
答:可以通过实现PropertyFilter
接口来过滤不需要序列化的字段,在实现apply
方法时,根据字段名或其他条件返回false
,即可过滤掉该字段,还可以使用@JSONField
注解的serialzeUsing
属性来指定自定义的序列化器,以实现更复杂的过滤逻辑。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1430140.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复