ObjectMapper

本文介绍如何通过继承jackson的ObjectMapper类实现对JSON格式的统一处理,包括对空值、时间格式等细节的定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ObjectMapper类是jackson的主要类,主要用来实现java类和json对象之间的转换

一般来说web项目前后台会通过json对象进行数据之间的交流,会涉及到json格式之间的统一性问题,这个时候一般就会重写ObjectMapper类,进行数据格式统一设置

比如对于空值或者时间格式的处理

public class ObjectMapping extends ObjectMapper {


String object = "";


// 默认构造函数
public ObjectMapping() {
super();
this.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, false);
this.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
this.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
this.configure(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS, true);
this.getSerializerProvider().setNullValueSerializer(//对空值的处理
new JsonSerializer<Object>() {
@Override
public void serialize(Object value, JsonGenerator jg,
SerializerProvider sp) throws IOException,
JsonProcessingException {
String name = ((org.codehaus.jackson.impl.Utf8Generator) jg)
.getOutputContext().getCurrentName();
if (object.indexOf(name) == -1) {
jg.writeString("");
} else {
jg.writeStartObject();
jg.writeEndObject();
}
}
});
this.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); //时间格式的处理
}
}


其中一些jsonParse解析相关配置属性

/**
         * 这个特性,决定了解析器是否将自动关闭那些不属于parser自己的输入源。 如果禁止,则调用应用不得不分别去关闭那些被用来创建parser的基础输入流InputStream和reader;
         * 如果允许,parser只要自己需要获取closed方法(当遇到输入流结束,或者parser自己调用 JsonParder#close方法),就会处理流关闭。
         * 注意:这个属性默认是true,即允许自动关闭流
         */
        AUTO_CLOSE_SOURCE(true),

        // // // Support for non-standard data format constructs

        /**
         * 该特性决定parser将是否允许解析使用Java/C++ 样式的注释(包括'/'+'*' 和'//' 变量)。 由于JSON标准说明书上面没有提到注释是否是合法的组成,所以这是一个非标准的特性;
         * 尽管如此,这个特性还是被广泛地使用。
         * 注意:该属性默认是false,因此必须显式允许,即通过JsonParser.Feature.ALLOW_COMMENTS 配置为true。
         */
        ALLOW_COMMENTS(false),

        /**
         * 这个特性决定parser是否将允许使用非双引号属性名字, (这种形式在Javascript中被允许,但是JSON标准说明书中没有)。
         * 注意:由于JSON标准上需要为属性名称使用双引号,所以这也是一个非标准特性,默认是false的。
         * 同样,需要设置JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES为true,打开该特性。
         */
        ALLOW_UNQUOTED_FIELD_NAMES(false),

        /**
         * 该特性决定parser是否允许单引号来包住属性名称和字符串值。
         * 注意:默认下,该属性也是关闭的。需要设置JsonParser.Feature.ALLOW_SINGLE_QUOTES为true
         */
        ALLOW_SINGLE_QUOTES(false),

        /**
         * 该特性决定parser是否允许JSON字符串包含非引号控制字符(值小于32的ASCII字符,包含制表符和换行符)。 如果该属性关闭,则如果遇到这些字符,则会抛出异常。
         * JSON标准说明书要求所有控制符必须使用引号,因此这是一个非标准的特性。
         * 注意:默认时候,该属性关闭的。需要设置:JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS为true。
         */
        ALLOW_UNQUOTED_CONTROL_CHARS(false),

        /**
         * 该特性可以允许接受所有引号引起来的字符,使用‘反斜杠\’机制:如果不允许,只有JSON标准说明书中 列出来的字符可以被避开约束。
         * 由于JSON标准说明中要求为所有控制字符使用引号,这是一个非标准的特性,所以默认是关闭的。
         * 注意:一般在设置ALLOW_SINGLE_QUOTES属性时,也设置了ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER属性,
         * 所以,有时候,你会看到不设置ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER为true,但是依然可以正常运行。
         * @since 1.6
         */
        ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false),

        /**
         * 该特性决定parser是否允许JSON整数以多个0开始(比如,如果000001赋值给json某变量,
         * 如果不设置该属性,则解析成int会抛异常报错:org.codehaus.jackson.JsonParseException: Invalid numeric value: Leading zeroes not
         * allowed)
         * 注意:该属性默认是关闭的,如果需要打开,则设置JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS为true。
         * @since 1.8
         */
        ALLOW_NUMERIC_LEADING_ZEROS(false),

        /**
         * 该特性允许parser可以识别"Not-a-Number" (NaN)标识集合作为一个合法的浮点数。 例如: allows (tokens are quoted contents, not including
         * quotes):
         * <ul>
         * <li>"INF" (for positive infinity), as well as alias of "Infinity"
         * <li>"-INF" (for negative infinity), alias "-Infinity"
         * <li>"NaN" (for other not-a-numbers, like result of division by zero)
         * </ul>
         */

        ALLOW_NON_NUMERIC_NUMBERS(false),

        // // // Controlling canonicalization (interning etc)

        /**
         * 该特性决定JSON对象属性名称是否可以被String#intern 规范化表示。
         *
         * 如果允许,则JSON所有的属性名将会 intern() ;如果不设置,则不会规范化,
         *
         * 默认下,该属性是开放的。此外,必须设置CANONICALIZE_FIELD_NAMES为true
         *
         * 关于intern方法作用:当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串 (该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String
         * 对象添加到池中, 并且返回此 String 对象的引用。
         *
         * @since 1.3
         */
        INTERN_FIELD_NAMES(true),

        /**
         * 该特性决定JSON对象的属性名称是否被规范化。
         *
         * @since 1.5
         */
        CANONICALIZE_FIELD_NAMES(true)


总结注意:

1. ObjectMapper 可用来序列化和反序列化对象,而 JsonParser 是用来反序列化的,JsonGenerator 是序列化的。若想让代码职责分明,就用 JsonParser 或  JsonGenerator 代替 ObjectMapper 来用

2. ObjectMapper 和 JsonGenerator 有各种各样的 writeXxx() 方法,可以让结果输出到不同的目的地; 同样  ObjectMapper 和 JsonParser 也有各色 readXxx() 方法,方便你从不同的源获得数据

3. 多看看 Jackson 为我们提供了注释 Annotation,留意上面那几个 Feature 中有些什么枚举值

ObjectMapper 是 Jackson 库中的一个核心类,用于处理 JSON 数据和 Java 对象之间的转换。Jackson 是一种广泛使用的高性能 JSON 处理库,在许多基于 Java 的项目中都可以见到它的身影。 ### ObjectMapper 功能简介 1. **JSON 转换**: - 将 Java 对象序列化为 JSON 字符串。 ```java String jsonString = objectMapper.writeValueAsString(javaObject); ``` - 将 JSON 字符串反序列化为 Java 对象。 ```java MyClass javaObject = objectMapper.readValue(jsonString, MyClass.class); ``` 2. **文件操作**: - 支持直接读取 JSON 文件并将其映射到 Java 类实例。 ```java MyClass objFromFile = objectMapper.readValue(new File("file.json"), MyClass.class); ``` 3. **树模型支持**: - 使用 `JsonNode` 表示任意结构化的 JSON 数据,并允许逐层遍历数据内容。 ```java JsonNode rootNode = objectMapper.readTree(jsonString); ``` 4. **自定义配置**: - 提供多种选项来自定义其行为,例如设置日期格式、忽略未知字段等。 ```java objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); ``` 5. **注解驱动**: - 可通过特定的注解控制对象与 JSON 间的转换规则,比如指定属性名别名 (`@JsonProperty`) 或者跳过某些字段(如 `@JsonIgnore`)。 ### 示例代码片段 ```java import com.fasterxml.jackson.databind.ObjectMapper; public class Example { public static void main(String[] args) throws Exception{ // 创建 ObjectMapper 实例 ObjectMapper mapper = new ObjectMapper(); // 定义一个简单的 POJO 类型的对象 MyData data = new MyData(); data.setName("Alice"); data.setValue(42); // 序列化成 JSON 字符串 String jsonStr = mapper.writeValueAsString(data); System.out.println(jsonStr); // 再从该字符串解析回原状 MyData restoredObj = mapper.readValue(jsonStr, MyData.class); System.out.println(restoredObj.getName()); } } ``` 其中假设存在对应的POJO类型MyData
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值