fasterxml.jackson.

本文介绍如何使用Jackson库实现Java对象与JSON之间的相互转换。通过示例代码展示了如何将一个包含列表属性的Java对象序列化为JSON字符串,并反序列化回原始对象,验证转换过程的正确性。

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

Jackson是Java中众多json处理工具的一个,比起常见的Json-lib,Gson要快一些。


import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;




第一步 准备工具类
1.CommonUtil类负责new mapper
具体如下:
/**********************CommonUtil类*****************************************/
private static ObjectMapper mapper;  
public static synchronized ObjectMapper getMapperInstance(boolean createNew) {  
        if (createNew) {  
            return new ObjectMapper();  
        } else if (mapper == null) {  
            mapper = new ObjectMapper();  
        }  
        return mapper;  
 }
/**********************CommonUtil类*****************************************/
第二步 你的实体类 举例子说明


/**********************Entity类*****************************************/
public class Person {  
    private String name;  
    private int age;  
  
    public Person() {  
    }  
  
    public Person(String name, int age) {  
        super();  
        this.name = name;  
        this.age = age;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    @Override  
    public boolean equals(Object obj) {  
        if (this == obj) {  
            return true;  
        }  
        if (obj == null) {  
            return false;  
        }  
        if (getClass() != obj.getClass()) {  
            return false;  
        }  
        Person other = (Person) obj;  
        if (age != other.age) {  
            return false;  
        }  
        if (name == null) {  
            if (other.name != null) {  
                return false;  
            }  
        } else if (!name.equals(other.name)) {  
            return false;  
        }  
        return true;  
    }  
  
}  
/**********************Entity类*****************************************/


/**********************带集合Entity类*****************************************/
public class TestVo {   
    private String voName;   
    private List<Person> pers;   
  
    public TestVo() {   
    }   
  
    public TestVo(String voName, List<Person> pers) {   
        super();   
        this.voName = voName;   
        this.pers = pers;   
    }   
  
    public String getVoName() {   
        return voName;   
    }   
  
    public void setVoName(String voName) {   
        this.voName = voName;   
    }   
  
    public List<Person> getPers() {   
        return pers;   
    }   
  
    public void setPers(List<Person> pers) {   
        this.pers = pers;   
    }   
  
    @Override  
    public boolean equals(Object obj) {   
        if (this == obj) {   
            return true;   
        }   
        if (obj == null) {   
            return false;   
        }   
        if (getClass() != obj.getClass()) {   
            return false;   
        }   
        TestVo other = (TestVo) obj;   
        if (pers == null) {   
            if (other.pers != null) {   
                return false;   
            }   
        } else if (pers.size() != other.pers.size()) {   
            return false;   
        } else {   
            for (int i = 0; i < pers.size(); i++) {   
                if (!pers.get(i).equals(other.pers.get(i))) {   
                    return false;   
                }   
            }   
        }   
        if (voName == null) {   
            if (other.voName != null) {   
                return false;   
            }   
        } else if (!voName.equals(other.voName)) {   
            return false;   
        }   
        return true;   
    }   
}  
/**********************带集合Entity类*****************************************/


/**********************Bean2Json类*****************************************/
public static String beanToJson(Object obj) throws IOException {   
     
        ObjectMapper mapper = CommonUtil.getMapperInstance(false);   
        StringWriter writer = new StringWriter();   
        JsonGenerator gen = new JsonFactory().createJsonGenerator(writer);   
        mapper.writeValue(gen, obj);   
        gen.close();   
        String json = writer.toString();   
        writer.close();   
        return json;   
    }  
/**********************Bean2Json类*****************************************/


/**********************Json2Bean类*****************************************/
public static Object  jsonToBean(String json, Class<?> cls) throws Exception {   
    Object vo = mapper.readValue(json, cls);   
    return vo;   
}  
/**********************Json2Bean类*****************************************/


测试一下吧:


public static void main(String[] args) throws Exception {  
    // 准备数据  
    List<Person> pers = new ArrayList<Person>();  
    Person p = new Person("张三", 46);  
    pers.add(p);  
    p = new Person("李四", 19);  
    pers.add(p);  
    p = new Person("王二麻子", 23);  
    pers.add(p);  
    TestVo vo = new TestVo("一个容器而已", pers);  
    // 实体转JSON字符串  
    String json = beanToJson(vo);  
    System.out.println("Bean>>>Json----" + json);  
    // 字符串转实体  
    TestVo vo2 = (TestVo)jsonToBean(json, TestVo.class);  
    System.out.println("Json>>Bean--与开始的对象是否相等:" + vo2.equals(vo));  
  
}

### com.fasterxml.jackson.databind.exc 包常见问题及解决方法 #### 1. **InvalidFormatException** `com.fasterxml.jackson.databind.exc.InvalidFormatException` 是 Jackson 在反序列化过程中遇到数据类型不匹配时抛出的异常。例如,将字符串类型的日期转换为 `java.util.Date` 类型时,如果格式不正确,就会抛出该异常。 解决方案可以通过自定义反序列化器来处理特定格式的数据[^2]。以下是一个示例代码: ```java import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class CustomJsonDateDeserializer extends JsonDeserializer<Date> { @Override public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = jp.getText(); try { return format.parse(date); } catch (ParseException e) { throw new RuntimeException(e); } } } ``` 在需要的属性上添加注解以使用自定义反序列化器: ```java @JsonDeserialize(using = CustomJsonDateDeserializer.class) private Date customDate; ``` #### 2. **InvalidDefinitionException** `com.fasterxml.jackson.databind.exc.InvalidDefinitionException` 表示 Jackson 无法找到类的序列化器或反序列化器,通常是因为类中没有可识别的属性或构造函数。 解决方案可以禁用 `SerializationFeature.FAIL_ON_EMPTY_BEANS` 特性,或者为类添加无参构造函数和 getter/setter 方法[^3]。以下是配置示例: ```java ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); ``` 此外,确保类中包含至少一个非静态字段,并提供默认构造函数: ```java public class DateLikeForm { private String content; public DateLikeForm() {} public String getContent() { return content; } public void setContent(String content) { this.content = content; } } ``` #### 3. **UnrecognizedPropertyException** `com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException` 表示 JSON 数据中包含未知字段,而这些字段未被目标类定义。 解决方案可以通过在类上添加 `@JsonIgnoreProperties(ignoreUnknown = true)` 注解来忽略未知字段[^4]。示例如下: ```java import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) public class Account { private String username; private String password; // Getters and Setters } ``` #### 4. **MismatchedInputException** `com.fasterxml.jackson.databind.exc.MismatchedInputException` 表示 JSON 数据结构与目标类不匹配,例如数组与对象之间的类型不一致。 解决方案可以调整 JSON 数据结构或修改目标类定义以匹配数据。例如,当 JSON 数据为数组时,目标类应定义为集合类型: ```java import java.util.List; public class UserList { private List<User> users; // Getters and Setters } ``` #### 5. **JsonMappingException** `com.fasterxml.jackson.databind.JsonMappingException` 是 Jackson 在映射 JSON 数据时发生的通用异常,可能由多种原因引起。 解决方案包括检查 JSON 数据的有效性、确保类定义正确以及适当配置 `ObjectMapper`。例如,启用宽松模式: ```java ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ``` --- ### 示例代码总结 以下是一个综合示例,展示如何配置 `ObjectMapper` 并处理常见问题: ```java import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.SerializationFeature; public class JacksonConfig { public static ObjectMapper getObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); return objectMapper; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值