jackjson的使用

     Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。

相比json-lib,jackjson的使用更加的简单方便所依赖的jar包也比较少,jackjson的社区比较的活跃,版本更新的速度较快,jackjson同时能支持注解的方式和对xml进行转换。

 

        User user = new User();
        user.setName("小明");
        user.setEmail("xiaoming@qq.com");
        user.setAge(20);
        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        user.setBirthday(dateformat.parse("2014-10-01 17:39:11"));

        ObjectMapper objectMapper = new ObjectMapper();
        // 将对象转换成json格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

        String json = objectMapper.writeValueAsString(user);
        System.out.println(json);
        // 将json格式转换成对象

        User user2 = objectMapper.readValue(json, User.class);
        System.out.println(user2.toString());
       
        // 将集合转换成json
        List<User> list = new ArrayList<User>();
        list.add(user);
        String jsonString = objectMapper.writeValueAsString(list);
        System.out.println(jsonString);
        // json转换成集成对象
        objectMapper.writeValue(new File("E:/lib/jackjson/jackjsonTest.txt"), jsonString);
       
        User user3 = new Lisi();
        user3.setAge(30);
        user3.setBirthday(new Date());
        user3.setEmail("11@22.com");
        user3.setName("lisi");
        System.out.println(objectMapper.writeValueAsString(user3));

   

      jackjson的常用注解如下:

        @JsonIgnoreProperties(ignoreUnknown=true) :对于未知的属性,进行忽略

        @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class") :作用于类/接口,被用来开启多态类型处理,对基类/接口和子类/实现类都有效.

             

         @JsonIgnore:可以忽略的属性

 

       关于jackjson中注解的详细说明,可以参考

          http://blog.youkuaiyun.com/sdyy321/article/details/40298081

### 使用 Jackson 替换 Gson 进行 JSON 序列化与反序列化 Jackson 是一个广泛使用Java JSON 处理库,其核心组件 `jackson-databind` 提供了类似于 Gson 的对象序列化与反序列化功能。在实际开发中,尤其是在 Spring Boot 项目中,Jackson 被默认使用,因此在某些场景下更适合替代 Gson。 #### Jackson 的基本使用方式 Jackson 通过 `ObjectMapper` 类来完成 JSONJava 对象之间的转换。与 Gson 不同的是,Jackson 默认依赖类的 getter 和 setter 方法进行序列化和反序列化操作。若类中字段没有对应的 getter 或 setter 方法,Jackson 可能无法正确映射字段。 ```java ObjectMapper objectMapper = new ObjectMapper(); // 序列化 User user = new User("Alice", 25); String json = objectMapper.writeValueAsString(user); // 反序列化 String jsonInput = "{\"name\":\"Bob\",\"age\":30}"; User parsedUser = objectMapper.readValue(jsonInput, User.class); ``` 这种方式适用于简单类型,如 `User.class`,同时也支持泛型结构的解析。 #### 泛型结构的解析 在处理泛型结构时,Jackson 提供了 `TypeReference` 类来保留泛型信息。例如,将 JSON 字符串转换为 `List<User>` 类型时,可以使用如下方式: ```java String jsonArray = "[{\"name\":\"Alice\",\"age\":25},{\"name\":\"Bob\",\"age\":30}]"; List<User> users = objectMapper.readValue(jsonArray, new TypeReference<List<User>>() {}); ``` 该方法与 FastJSON 的 `TypeReference` 用法类似,能够保留泛型信息并正确解析嵌套结构。 #### 字段命名策略与自定义注解 Jackson 支持通过注解自定义字段名称,类似于 Gson 的 `@SerializedName` 注解。Jackson 使用 `@JsonProperty` 注解来指定 JSON 字段名称: ```java public class User { @JsonProperty("userName") private String name; @JsonProperty("userAge") private int age; // getter 和 setter } ``` 若类中字段名与 JSON 字段名不一致,并且没有使用默认的 getter/setter 方法名,则必须在方法或字段上添加 `@JsonProperty` 注解以确保正确映射[^5]。 #### 配置 Jackson 以支持更复杂的场景 Jackson 支持多种配置选项,例如日期格式、忽略未知字段等。可以通过 `ObjectMapper` 进行全局配置: ```java ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ``` 这些配置可以提升 Jackson 在处理复杂 JSON 数据时的灵活性和兼容性。 #### Jackson 与 Gson 的兼容性 虽然 Jackson 和 Gson 都支持 JSON 的序列化与反序列化,但两者在实现机制上存在差异。Jackson 更加依赖类的 getter 和 setter 方法,而 Gson 则可以直接访问字段(即使没有 getter/setter)。因此,在替换过程中需要注意字段访问方式的兼容性。 此外,不同库对某些类型(如 `Timestamp`)的序列化格式可能存在差异,因此在跨库使用时可能会导致反序列化失败。为了避免此类问题,应确保序列化与反序列化使用相同的库。 --- ### 示例对比 | Gson 用法 | Jackson 等价实现 | |-----------|------------------| | `gson.toJson(user)` | `objectMapper.writeValueAsString(user)` | | `gson.fromJson(json, User.class)` | `objectMapper.readValue(json, User.class)` | | `gson.fromJson(json, new TypeToken<List<User>>(){}.getType())` | `objectMapper.readValue(json, new TypeReference<List<User>>() {})` | --- ### 相关问题 1. Jackson 如何处理嵌套泛型结构? 2. Jackson 是否支持直接访问私有字段? 3. 如何在 Jackson 中自定义日期格式? 4. Jackson 与 Gson 在性能上有何差异?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值