Jackson转换

package com.zhouyuan.mydemo.util;


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;


import com.zhouyuan.mydemo.entity.User;


public class JSONUtil {
private static ObjectMapper mapper = new ObjectMapper();

/**
* 将java对象转为JSON字符串
* @throws Exception 
* @throws JsonMappingException 
* @throws JsonGenerationException 
*/
public String javaToJson() throws Exception{
User user = new User();
user.setId(111);
user.setUserName("Json");
user.setPassword("123345");
user.setAddress("贵州");
user.setHobby("篮球");
String json = mapper.writeValueAsString(user);
return json;
}


public static void main(String[] args) throws Exception {
JSONUtil ju = new JSONUtil();
//String json = ju.javaToJson();
String json = ju.listToJson();
//将json字符转为Java对象
//User user = (User) ju.jsonToJava(json);
/*System.out.println(json);
List<Object> users = ju.jsonToList(json);
System.out.println(users);*/
//System.out.println(user);
System.out.println(json);
}


/**
* 将JSON字符串转为Java对象
* @throws IOException 
* @throws JsonMappingException 
* @throws JsonParseException 
*/
public Object jsonToJava(String json) throws JsonParseException, JsonMappingException, IOException{
User user  = mapper.readValue(json, User.class);
return user;
}

/**
* 将Java集合转为JSON字符串
* @throws IOException 
* @throws JsonMappingException 
* @throws JsonGenerationException 
*/
public String listToJson() throws JsonGenerationException, JsonMappingException, IOException{
User user = new User();
user.setId(111);
user.setUserName("Json");
user.setPassword("123345");
user.setAddress("贵州");
user.setHobby("篮球");

User user1 = new User();
user1.setId(112);
user1.setUserName("hello");
user1.setPassword("532");
user1.setAddress("上海");
user1.setHobby("排球");

List<User> lists = new ArrayList<User>();
lists.add(user);
lists.add(user1);
String json = mapper.writeValueAsString(lists);
return json;
}

public List<Object> jsonToList(String json) throws JsonParseException, JsonMappingException, IOException{
List<Object> obj = mapper.readValue(json, new TypeReference<List<User>>(){});
return obj;    
}

/**
* 将Java数组转为JSON字符串
*/
public String arrayToJson(){
return null;
}
}
<think>我们正在处理一个关于Jackson数据转换库的使用指南请求。用户希望了解如何使用Jackson进行数据转换,特别是序列化和反序列化操作。根据提供的引用,Jackson是一个处理JSON与Java对象之间转换的流行库。 我们将参考以下引用: [^1] 介绍了Jackson的基本用途:将请求参数(如前端发送的JSON数据)和响应数据转换成Java对象,或将Java对象转换为JSON字符串。 [^2] 提到了Jackson-Datatype-JTS,用于处理地理空间数据。 [^3] 介绍了Jackson Datatype Money,用于处理货币数据。 [^4] 介绍了GeoJson-Jackson,用于处理GeoJSON格式。 [^5] 提到了使用注解(如@XmlRootElement, @XmlElement, @JsonProperty)来处理映射。 用户的问题比较宽泛,因此我们将提供Jackson核心功能的使用指南,包括: 1. 添加Jackson依赖 2. 基本序列化(Java对象转JSON) 3. 基本反序列化(JSON转Java对象) 4. 使用注解处理映射问题 5. 处理日期、集合等常见类型 6. 介绍扩展模块(如Money、JTS等)的简要使用 由于引用中提到了几个扩展模块(Money, JTS, GeoJson),我们也会简要说明如何集成这些模块,但重点放在核心功能上。 注意:我们假设用户使用Maven进行依赖管理。 步骤: 1. 添加依赖(核心库) 2. 创建简单的Java对象 3. 使用ObjectMapper进行序列化和反序列化 4. 使用注解自定义映射 5. 处理复杂情况(如日期格式、集合) 6. 扩展模块的集成(简要) 我们将按照这个步骤来编写使用指南。</think>### Jackson 数据转换使用指南 Jackson 是 Java 生态中处理 JSON 与 Java 对象转换的核心库,支持序列化(Java→JSON)和反序列化(JSON→Java)。以下是关键操作指南: --- #### **1. 基础配置** **依赖添加**(Maven): ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> ``` **核心类 `ObjectMapper`**: ```java ObjectMapper mapper = new ObjectMapper(); ``` --- #### **2. 基础序列化与反序列化** - **Java对象 → JSON** ```java User user = new User("Alice", 30); String json = mapper.writeValueAsString(user); // 输出: {"name":"Alice","age":30} ``` - **JSON → Java对象** ```java String json = "{\"name\":\"Bob\",\"age\":25}"; User user = mapper.readValue(json, User.class); ``` --- #### **3. 注解控制映射关系** 通过注解解决字段名不一致、忽略字段等问题[^5]: ```java public class User { @JsonProperty("user_name") // JSON字段映射 private String name; @JsonIgnore // 忽略序列化 private String password; @JsonFormat(pattern = "yyyy-MM-dd") // 日期格式化 private Date birthDate; } ``` --- #### **4. 处理复杂类型** - **集合类型** ```java List<User> users = mapper.readValue(json, new TypeReference<List<User>>() {}); ``` - **树模型(动态JSON)** ```java JsonNode rootNode = mapper.readTree(json); String name = rootNode.get("user_name").asText(); ``` --- #### **5. 扩展模块集成** Jackson 支持通过模块扩展数据类型处理能力: - **货币类型**(`jackson-datatype-money`)[^3] ```java mapper.registerModule(new MoneyModule()); MonetaryAmount amount = new MoneyBuilder().setCurrency("USD").setAmount(99.99).build(); String json = mapper.writeValueAsString(amount); // {"amount":99.99,"currency":"USD"} ``` - **地理空间数据**(`jackson-datatype-jts`)[^2][^4] ```java mapper.registerModule(new JtsModule()); Point point = new GeometryFactory().createPoint(new Coordinate(102, 0.5)); String geojson = mapper.writeValueAsString(point); // {"type":"Point","coordinates":[102,0.5]} ``` --- #### **6. 高级特性** - **自定义序列化/反序列化** 继承 `JsonSerializer`/`JsonDeserializer`: ```java public class CustomSerializer extends JsonSerializer<User> { @Override public void serialize(User value, JsonGenerator gen, SerializerProvider provider) { gen.writeString(value.getName().toUpperCase()); } } mapper.registerModule(new SimpleModule().addSerializer(User.class, new CustomSerializer())); ``` - **多态类型处理** 使用 `@JsonTypeInfo` 注解实现子类自动识别: ```java @JsonTypeInfo(use = Id.NAME, property = "type") @JsonSubTypes({ @Type(value = Cat.class, name = "cat"), @Type(value = Dog.class, name = "dog") }) public abstract class Animal {} ``` --- #### **7. 性能优化** - 复用 `ObjectMapper` 实例(线程安全) - 启用 `WRITE_DATES_AS_TIMESTAMPS` 避免冗余日期转换: ```java mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); ``` > **注意**:JSON 属性名默认遵循 Java 字段的驼峰命名(如 `userName` 映射 `user_name` 需显式注解)[^1][^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值