JackSon 使用指南

一.JackSon介绍

Jackson是一个基于Java应用库,将Java对象转换成json对象和xml文档,也可以将json、xml转换成Java对象。

1、三种方式处理JSON

  • 流式API:读取并将JSON内容写入作为离散事件。 JsonParser读取数据,而JsonGenerator写入数据。
  • 树模型:准备JSON文件在内存里以树形式表示。 ObjectMapper构建JsonNode节点树。
  • 数据绑定:转换JSON并从POJO(普通Java对象)使用属性访问或使用注释。它有两个类型:(1)简单的数据绑定,转换JSON和Java Maps, Lists, Strings, Numbers, Booleans 和null 对象。(2)全部数据绑定 - 转换为JSON从任何JAVA类型。ObjectMapper读/写JSON两种类型的数据绑定。

2、所需要的jar包

jackson-all-1.9.0.jar.zip

二.Jackson实现

1、Java对象反序列化

​import java.io.IOException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

public class JacksonTester {
   public static void main(String args[]){
      ObjectMapper mapper = new ObjectMapper();
      String jsonString = "{\"name\":\"Mahesh\", \"age\":21}";

      //map json to student
      try {
         Student student = mapper.readValue(jsonString, Student.class);
         System.out.println(student);
         mapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);
         jsonString = mapper.writeValueAsString(student);
         System.out.println(jsonString);

      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

class Student {
   private String name;
   private int age;
   public Student(){}
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String toString(){
      return "Student [ name: "+name+", age: "+ age+ " ]";
   }	
}

验证输出:

Student [ name: Mahesh, age: 21 ] { "name" : "Mahesh", "age" : 21 }

2、Java对象序列化

注解定制序列化

  • @JsonInclude(Include.NON_EMPTY):仅在属性不为空时序列化此字段,对于字符串,即null或空字符串。
  • @JsonIgnore:序列化时忽略此字段。
  • @JsonProperty(value = "user_name"):指定序列化时的字段名,默认使用属性名。
  • @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8"):指定Date类字段序列化时的格式。
  • @JsonUnwrapped(prefix = "user_"):private User user,把成员对象中的属性提升到其容器类,并添加给定的前缀。"user_name": "xxx", "user_age": 22, ...
  • @JsonIgnoreType:类注解,序列化时忽略此类。
  • @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id") :作用于类或属性上,被用来在序列化/反序列化时为该对象或字段添加一个对象识别码,通常是用来解决循环嵌套的问题。
import java.io.IOException; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
   
import com.fasterxml.jackson.databind.ObjectMapper; 
   
public class JacksonDemo { 
    public static void main(String[] args) throws ParseException, IOException { 
        User user = new User(); 
        user.setName("小民");  
        user.setEmail("[email protected]"); 
        user.setAge(20); 
           
        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd"); 
        user.setBirthday(dateformat.parse("1996-10-01"));        
           
        /**
         * ObjectMapper是JSON操作的核心,Jackson的所有JSON操作都是在ObjectMapper中实现。
         * ObjectMapper有多个JSON序列化的方法,可以把JSON字符串保存File、OutputStream等不同的介质中。
         * writeValue(File arg0, Object arg1)把arg1转成json序列,并保存到arg0文件中。
         * writeValue(OutputStream arg0, Object arg1)把arg1转成json序列,并保存到arg0输出流中。
         * writeValueAsBytes(Object arg0)把arg0转成json序列,并把结果输出成字节数组。
         * writeValueAsString(Object arg0)把arg0转成json序列,并把结果输出成字符串。
         */ 
        ObjectMapper mapper = new ObjectMapper(); 
           
        //User类转JSON 
        //输出结果:{"name":"小民","age":20,"birthday":844099200000,"email":"[email protected]"} 
        String json = mapper.writeValueAsString(user); 
        System.out.println(json); 
           
        //Java集合转JSON 
        //输出结果:[{"name":"小民","age":20,"birthday":844099200000,"email":"[email protected]"}] 
        List users = new ArrayList(); 
        users.add(user); 
        String jsonlist = mapper.writeValueAsString(users); 
        System.out.println(jsonlist); 
    } 
} 

三.遍历树模型

import java.io.IOException;
import java.util.Iterator;

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {
         ObjectMapper mapper = new ObjectMapper();
         String jsonString = "{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
         JsonNode rootNode = mapper.readTree(jsonString);

         JsonNode nameNode = rootNode.path("name");
         System.out.println("Name: "+ nameNode.getTextValue());

         JsonNode ageNode = rootNode.path("age");
         System.out.println("Age: " + ageNode.getIntValue());

         JsonNode verifiedNode = rootNode.path("verified");
         System.out.println("Verified: " + (verifiedNode.getBooleanValue() ? "Yes":"No"));

         JsonNode marksNode = rootNode.path("marks");
         Iterator iterator = marksNode.getElements();
         System.out.print("Marks: [ ");
         while (iterator.hasNext()) {
            JsonNode marks = iterator.next();
            System.out.print(marks.getIntValue() + " "); 
         }
         System.out.println("]");
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

 

你可能感兴趣的:(Java开发)