Jackson2库基础用法-Java json 序列化

本文介绍了Jackson2库的基础用法,包括如何添加依赖、解析JSON字符串、序列化对象、将JSON转换为Map对象,以及如何自定义日期格式和在不修改POJO的情况下进行格式化。同时,提到了在不同环境下同一个对象可以序列化出不同值的情况,类比于数据库的视图模式。详情可参考官方文档。

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

Jackson2库基础用法-Java json 序列化

依赖


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

用法示例

  • 如何解析json字符串?

String json1 = "{\"name\":\"zhang\", \"age\":200,\"map\":{\"a\":\"b\"},\"list\":[{\"a\":0,\"b\":\"100\"},{\"a\":0,\"b\":\"100\"}]}";
ObjectMapper om = new ObjectMapper();
JsonNode root = om.readTree(json1);

String name = root.get("name").asText();
assertEquals("zhang",name);

int age = root.get("age").asInt();
assertEquals(200,age);

assertEquals("100",root.get("list").get(1).get("b").asText());

JsonNode map = root.get("map");
if(map.getNodeType()== JsonNodeType.OBJECT){
    String jsonValue = map.toString();
    System.out.println("Node Json String:"+jsonValue);
    Iterator<JsonNode> iterator = map.elements();
    while(iterator.hasNext()){
        JsonNode node = iterator.next();
        System.out.println(node.asText());
    }
}


  • 如何序列化对象为json字符串?

class Obj{
    private String name="name";
    private int age=100;
    private String nullPro = null;

    public String getNullPro() {
        return nullPro;
    }

    public void setNullPro(String nullPro) {
        this.nullPro = nullPro;
    }
    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;
    }
}

----

Map<String,Object> objectMap = new HashMap<>();
objectMap.put("obj",new Obj());
objectMap.put("list",Arrays.asList(new String[]{"hello","jackson"}));
objectMap.put("string","ok");
objectMap.put("null",null);
objectMap.put("number",12e3-1);
ObjectMapper om = new ObjectMapper();
om.setSerializationInclusion(JsonInclude.Include.NON_NULL);
System.out.println(om.writer().withDefaultPrettyPrinter().writeValueAsSting(objectMap));

  • 如何解析json字符串为Map对象?

String json1 = "{\"name\":\"zhang\", \"age\":200,\"map\":{\"a\":\"b\"},\"list\":[{\"a\":0,\"b\":\"100\"},{\"a\":0,\"b\":\"100\"}]}";
ObjectMapper om = new ObjectMapper();
Map<String, Object> map = om.readValue(json1, new TypeReference<Map<String, Object>>() {
});
assertTrue(map.get("name") instanceof String);
assertTrue(map.get("age") instanceof Integer);
assertTrue(map.get("map") instanceof Map);
assertTrue(map.get("list") instanceof List);
System.out.println(map);

通过 TypeReference 对象还可以将json字符串转成List<Object>

  • 如何定义对象序列化的日期格式?

Map<String, Object> map = new HashMap<>();
map.put("date", new Date());
ObjectMapper om = new ObjectMapper();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String json = om.writer().with(df).withDefaultPrettyPrinter().writeValueAsString(map);
System.out.println(json);

  • 通过传入一个注解对象来格式化对象输出?

abstract class MixInAnn{
    
    @JsonIgnore
    String passwd;
    
    @JsonProperty(value = "userId")
    String id;
}

class Obj {

    private int id=0;

    private String passwd="123456";

    private String name = "name";

    private int age = 100;

    //... setter and getter

}

----


ObjectMapper om = new ObjectMapper();
om.addMixIn(Obj.class,MixInAnn.class);
Obj obj = new Obj();
System.out.println(om.writer().withDefaultPrettyPrinter().writeValueAsSring(obj));

通过 addMinIn 可以在不侵入原始POJO对象的情况下,格式化序列化结果

  • 同一个对象在不同环境下序列化出不同的值


class Views {
    public static class Normal{};
    public static class Manager extends Normal{};
}

class Obj {

    @JsonView(Views.Normal.class)
    private int id=0;
    @JsonView(Views.Manager.class)
    private String passwd="123456";
    @JsonView(Views.Normal.class)
    private String name = "name";
    @JsonView(Views.Normal.class)
    private int age = 100;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    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;
    }
}


---

ObjectMapper om = new ObjectMapper();
Obj obj = new Obj();
String normal = om.writer().withView(Views.Normal.class).withDefaultPrettyPrinter().writeValueAsString(obj);
String manager = om.writer().withView(Views.Manager.class).withDefaultPrettyPrinter().writeValueAsString(obj);
System.out.println(normal);
System.out.println(manager);

类比数据库的视图模式和@JsonView,很容易理解它的使用场景

更多详细用法:

https://github.com/FasterXML/jackson-docs
https://github.com/FasterXML/jackson-docs/wiki

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值