Jackson的使用

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

一、一个简单的例子

将文件中的json数据转换成java对象。修改后再转换成json对象写入文件

1-1、文件json数据如下:

{
  "name" : { "first" : "Joe", "last" : "Sixpack" },
  "gender" : "MALE",
  "verified" : false,
  "userImage" : "Rm9vYmFyIQ=="
}
1-2、java对象

public class User {

    private Name name;

    private Gender gender;

    private boolean verified;

    private byte[] userImage;

    public enum Gender{
        MALE,FEMALE
    };

    class Name {
        private String first;
        private String last;

        public Name(){

        }

        public String getFirst() {
            return first;
        }

        public void setFirst(String first) {
            this.first = first;
        }

        public String getLast() {
            return last;
        }

        public void setLast(String last) {
            this.last = last;
        }
    }

    public Name getName() {
        return name;
    }

    public void setName(Name name) {
        this.name = name;
    }

    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

    public boolean isVerified() {
        return verified;
    }

    public void setVerified(boolean verified) {
        this.verified = verified;
    }

    public byte[] getUserImage() {
        return userImage;
    }

    public void setUserImage(byte[] userImage) {
        this.userImage = userImage;
    }

    @Override
    public String toString() {
        return "User{" +
                "name=" + name +
                ", gender=" + gender +
                ", verified=" + verified +
                ", userImage=" + Arrays.toString(userImage) +
                '}';
    }
}
1-3、使用jackson进行json对象转换

public class JacksonSimpleDemo {

    public static void main(String[] args) {
        String userFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"user.json";
        ObjectMapper mapper = new ObjectMapper();
        try {
            //将文件中的json数据转换成User对象
            User user = mapper.readValue(new File(userFilePath),User.class);
            System.out.println(user.toString());
            //将User对象修改后转成json数据并写入数据
            String changedFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"changed_user.json";
            user.setGender(User.Gender.FEMALE);
            mapper.writeValue(new File(changedFilePath),user);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
1-4、jsckson的maven坐标

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.5.3</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.5.3</version>
        </dependency>

代码下载地址:http://download.youkuaiyun.com/detail/jasonware/8676999


二、使用Map、ArrayList等对象进行转换

2-1、Jackson默认类型转换:

JSON Type

Java Type

object

LinkedHashMap<String,Object>

array

ArrayList<Object>

string

String

number (no fraction)

IntegerLong or BigInteger (smallest applicable)

number (fraction)

Double (configurable to use BigDecimal)

true|false

Boolean

null

null

下面,我们讲第“一”中的例子使用Map对象进行转换

<pre style="background-color:#ffffff;color:#000000;font-family:'Menlo';font-size:12.0pt;"><span style="color:#808080;font-style:italic;">//范型的使用方式
</span>String userFilePath_4_FMap = JacksonSimpleDemo.<span style="color:#000080;font-weight:bold;">class</span>.getResource(<span style="color:#008000;font-weight:bold;">"/"</span>).getPath()+<span style="color:#008000;font-weight:bold;">"user_4_FMap.json"</span>;
Map<String,User> userFMap = mapper.readValue(<span style="color:#000080;font-weight:bold;">new </span>File(userFilePath_4_FMap), <span style="color:#000080;font-weight:bold;">new </span>TypeReference<Map<String,User>>(){
});
System.<span style="color:#660e7a;font-weight:bold;font-style:italic;">out</span>.println(<span style="color:#008000;font-weight:bold;">"joe's lastName :"</span>+userFMap.get(<span style="color:#008000;font-weight:bold;">"joe"</span>).getName().getLast());
public class jacksonMapDemo { public static void main(String[] args) { String userFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"user.json"; ObjectMapper mapper = new ObjectMapper(); try { //读取json数据到Map对象 Map<String,Object> userMap = mapper.readValue(new File(userFilePath),Map.class); System.out.println(userMap); //写Map对象到json数据 Map<String,String> nameStruct = new HashMap<String,String>(); nameStruct.put("first", "Joe"); nameStruct.put("last", "may"); userMap.put("name", nameStruct); userMap.put("gender", "MALE"); userMap.put("verified", Boolean.FALSE); userMap.put("userImage", "Rm9vYmFyIQ=="); String changedFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"changed_user_4_map.json"; mapper.writeValue(new File(changedFilePath), userMap); } catch (IOException e) { e.printStackTrace(); } }}


我们可以看到控制台输出:

{name={first=Joe, last=Sixpack}, gender=MALE, verified=false, userImage=Rm9vYmFyIQ==}
以及生成的新文件内容

{"name":{"last":"may","first":"Joe"},"gender":"MALE","verified":false,"userImage":"Rm9vYmFyIQ=="}
2-2、上面例子我们使用了默认的Map<String,Object>类型,如果使用范型如Map<String,User>要怎么处理呢?java的擦除机制不允许使用Map<String,User>.class

jackson为范型提供了解决方案:

  Map<String,User> result = mapper.readValue(src, <span style="color:#FF0000;">new TypeReference<Map<String,User>>() { }</span>);
如:

json对象为:

{
  "joe":{
    "name" : { "first" : "Joe", "last" : "Sixpack" },
    "gender" : "MALE",
    "verified" : false,
    "userImage" : "Rm9vYmFyIQ=="
  }
}

代码为:

//范型的使用方式
            String userFilePath_4_FMap = JacksonSimpleDemo.class.getResource("/").getPath()+"user_4_FMap.json";
            Map<String,User> userFMap = mapper.readValue(new File(userFilePath_4_FMap), <span style="color:#FF6666;">new TypeReference<Map<String,User>>(){
            }</span>);
            System.out.println("joe's lastName :"+userFMap.get("joe").getName().getLast());
输出为:

joe's lastName :Sixpack

三、使用XML形式解析json。(json数据看起来就是一棵树结构)

public class JacksonXmlDemo {

    public static void main(String[] args) {
        String userFilePath = JacksonSimpleDemo.class.getResource("/").getPath()+"user.json";
        ObjectMapper mapper = new ObjectMapper();
        try {
            JsonNode rootNode = mapper.readTree(new File(userFilePath));
            JsonNode nameNode = rootNode.get("name");
            String   firstName = nameNode.get("first").asText();
            System.out.println("firstName is : "+firstName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
输出结果为:
Joe

<think>嗯,用户问的是Jackson使用方法。首先,我需要确定他们指的是哪个Jackson。因为Jackson通常指的是JavaJSON处理库,对吧?可能还有其他的,但大部分情况下是Jackson库。所以首先要确认这一点,但根据上下文,用户可能已经在Java开发中遇到需要处理JSON的情况,所以应该先介绍Jackson的基本用途和核心功能。 接下来,用户可能想知道如何开始使用Jackson,包括添加依赖、基本读写操作。所以需要分步骤说明。比如在Maven中添加依赖项,这是第一步。然后,如何将Java对象转为JSON,也就是序列化,以及如何从JSON反序列化为对象。这里要给出简单的示例代码,比如使用ObjectMapper的writeValueAsString和readValue方法。同时,可能需要提到一些常见注解,比如@JsonProperty,用来处理字段名不同的情况。 然后,用户可能需要处理复杂的情况,比如日期格式、忽略未知字段等配置。这时候需要说明如何配置ObjectMapper,比如设置日期格式,启用忽略未知属性,这些配置可以通过configure方法或者注解来实现。 另外,用户可能对Jackson的高级功能感兴趣,比如处理泛型集合,或者多态类型处理。这时候需要用例子展示如何读取和写入List或Map类型,以及使用@JsonTypeInfo来处理多态类型。 还需要提到异常处理,比如捕获JsonProcessingException和JsonParseException,这样用户在遇到错误时可以正确处理。 最后,给出一个综合示例,整合前面提到的各个部分,让用户有一个完整的认识。同时,提醒用户参考官方文档和社区资源,以便深入学习和解决问题。 检查是否有遗漏的部分,比如Jackson的三个核心模块,但可能用户作为初学者,可能不需要一开始就接触这些,所以放在最后的高级特性里简要提及。另外,确保所有的代码示例使用正确的语法,比如用$$包围独立代码块,行内代码用$,不过根据用户的问题,他们可能更关注代码的结构和用法,而不是具体的LaTeX格式,但按照系统指令,需要正确应用格式。需要确保所有的步骤清晰,结构合理,帮助用户从基础到高级逐步掌握Jackson使用方法。</think>以下为Jackson库的使用方法介绍,采用分步说明帮助您快速掌握核心功能: $$ \text{JacksonJava生态中最流行的JSON处理库} $$ $$ \text{核心功能:对象JSON的相互转换} $$ 一、环境配置(以Maven为例) ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> ``` 二、基础用法(对象JSON) 1. 创建ObjectMapper实例 ```java ObjectMapper mapper = new ObjectMapper(); ``` 2. Java对象JSON(序列化) ```java User user = new User("张三", 25); String json = mapper.writeValueAsString(user); // 输出:{"name":"张三","age":25} ``` 3. JSONJava对象(反序列化) ```java User parsedUser = mapper.readValue(json, User.class); ``` 三、常用配置 $$ \text{配置示例:日期格式未知属性处理} $$ ```java mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ``` 四、注解应用 1. 字段别名 ```java public class User { @JsonProperty("user_name") private String name; } ``` 2. 忽略字段 ```java @JsonIgnoreProperties(ignoreUnknown = true) public class User { ... } ``` 五、复杂类型处理 1. 泛型集合 ```java List<User> users = mapper.readValue(json, new TypeReference<List<User>>(){}); ``` 2. 多态类型 ```java @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") public abstract class Animal { ... } ``` 六、异常处理 ```java try { // 序列化/反序列化操作 } catch (JsonProcessingException e) { // 处理JSON格式错误 } ``` $$ \text{综合示例} $$ ```java public class Demo { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); User user = new User("李四", 30); String json = mapper.writeValueAsString(user); System.out.println(json); User parsed = mapper.readValue(json, User.class); } } ``` 高级特性建议: 1. 使用JsonNode进行树模型操作 2. 自定义序列化/反序列化器 3. 流式API处理大数据量 4. 支持YAML/XML等格式 官方文档:https://github.com/FasterXML/jackson-databind 注意:实际开发中建议配合单元测试验证转换逻辑,推荐使用JUnit+AssertJ进行验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值