杰克逊–如何解析JSON

Jackson提供了writeValue()readValue()方法来将Java对象转换为JSON。

mapper.writeValue – Java对象转换为JSON

ObjectMapper mapper = new ObjectMapper();

	// Java object to JSON file
	mapper.writeValue(new File("c:\\test\\staff.json"), new Staff());

	// Java object to JSON string, default compact-print
	String jsonString = mapper.writeValueAsString(new Staff());
	
	// pretty-print
	String jsonString2 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new Staff());

mapper.readValue – JSON到Java对象

ObjectMapper mapper = new ObjectMapper();

	//JSON file to Java object
	Staff obj = mapper.readValue(new File("c:\\test\\staff.json"), Staff.class);

	//JSON URL to Java object
	Staff obj = mapper.readValue(new URL("http://some-domains/api/staff.json"), Staff.class);

	//JSON string to Java Object
	Staff obj = mapper.readValue("{'name' : 'mkyong'}", Staff.class);

PS已在Jackson 2.9.8中测试

1.下载杰克逊

声明jackson-databind ,它将jackson-annotationsjackson-core

pom.xml
<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>2.9.8</version>
	</dependency>
Terminal
$ mvn dependency:tree

\- com.fasterxml.jackson.core:jackson-databind:jar:2.9.8:compile
[INFO]    +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile
[INFO]    \- com.fasterxml.jackson.core:jackson-core:jar:2.9.8:compile

2. POJO

一个简单的Java对象POJO,供以后测试。

Staff.java
public class Staff {

    private String name;
    private int age;
    private String[] position;              //  Array
    private List<String> skills;            //  List
    private Map<String, BigDecimal> salary; //  Map

	// getters , setters, some boring stuff
}

3. Java对象到JSON

JacksonExample1.java
package com.mkyong;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class JacksonExample1 {

    public static void main(String[] args) {

        ObjectMapper mapper = new ObjectMapper();

        Staff staff = createStaff();

        try {

            // Java objects to JSON file
            mapper.writeValue(new File("c:\\test\\staff.json"), staff);

            // Java objects to JSON string - compact-print
            String jsonString = mapper.writeValueAsString(staff);

            System.out.println(jsonString);

            // Java objects to JSON string - pretty-print
            String jsonInString2 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(staff);

            System.out.println(jsonInString2);

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

    }

    private static Staff createStaff() {

        Staff staff = new Staff();

        staff.setName("mkyong");
        staff.setAge(38);
        staff.setPosition(new String[]{"Founder", "CTO", "Writer"});
        Map<String, BigDecimal> salary = new HashMap() {{
            put("2010", new BigDecimal(10000));
            put("2012", new BigDecimal(12000));
            put("2018", new BigDecimal(14000));
        }};
        staff.setSalary(salary);
        staff.setSkills(Arrays.asList("java", "python", "node", "kotlin"));

        return staff;

    }

}

输出量

c:\\test\\staff.json
{"name":"mkyong","age":38,"position":["Founder","CTO","Writer"],"skills":["java","python","node","kotlin"],"salary":{"2018":14000,"2012":12000,"2010":10000}}
Terminal
{"name":"mkyong","age":38,"position":["Founder","CTO","Writer"],"skills":["java","python","node","kotlin"],"salary":{"2018":14000,"2012":12000,"2010":10000}}

{
  "name" : "mkyong",
  "age" : 38,
  "position" : [ "Founder", "CTO", "Writer" ],
  "skills" : [ "java", "python", "node", "kotlin" ],
  "salary" : {
    "2018" : 14000,
    "2012" : 12000,
    "2010" : 10000
  }
}

4. JSON到Java对象

JacksonExample2.java
package com.mkyong;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.IOException;

public class JacksonExample2 {

    public static void main(String[] args) {

        ObjectMapper mapper = new ObjectMapper();

        try {

            // JSON file to Java object
            Staff staff = mapper.readValue(new File("c:\\test\\staff.json"), Staff.class);

            // JSON string to Java object
            String jsonInString = "{\"name\":\"mkyong\",\"age\":37,\"skills\":[\"java\",\"python\"]}";
            Staff staff2 = mapper.readValue(jsonInString, Staff.class);

            // compact print
            System.out.println(staff2);

            // pretty print
            String prettyStaff1 = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(staff2);

            System.out.println(prettyStaff1);


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

    }

}

输出量

Staff{name='mkyong', age=37, position=null, skills=[java, python], salary=null}

{
  "name" : "mkyong",
  "age" : 37,
  "position" : null,
  "skills" : [ "java", "python" ],
  "salary" : null
}

5. @JsonProperty – JSON字段命名

5.1默认

public class Staff {

    private String name;
	private int age;

输出量

{"name":"abc", "age":38}

5.2使用@JsonProperty更改属性名称

public class Staff {

    @JsonProperty("custom_name")
    private String name;
	private int age;

输出量

{"custom_name":"abc", "age":38}

6. @JsonInclude –忽略空字段

默认情况下,Jackson将包含null字段。

{
  "name" : "mkyong",
  "age" : 38,
  "position" : null,
  "skills" : null,
  "salary" : null
}

6.1 @JsonInclude在课程级别。

Staff.java
import com.fasterxml.jackson.annotation.JsonInclude;

											//	ignore null fields , class level
@JsonInclude(JsonInclude.Include.NON_NULL) 	//  ignore all null fields
public class Staff {

    private String name;
    private int age;
    private String[] position;              
    private List<String> skills;           
    private Map<String, BigDecimal> salary; 
	//...

6.2 @JsonInclude在字段级别。

Staff.java
import com.fasterxml.jackson.annotation.JsonInclude;

public class Staff {

    private String name;
    private int age;
    
	@JsonInclude(JsonInclude.Include.NON_NULL) //ignore null field on this property only
    private String[] position;              
    
    private List<String> skills;           
	
    private Map<String, BigDecimal> salary;

输出量

{
  "name" : "mkyong",
  "age" : 38,
  "skill" : null,
  "salary" : null
}

6.3全球。

ObjectMapper mapper = new ObjectMapper();

	// ignore all null fields globally
	mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

注意
有关如何使用Jackson忽略空字段的更多示例

7. @JsonView

7.1 @JsonView用于限制不同用户的字段显示。 例如:

CompanyViews.java
package com.mkyong;

public class CompanyViews {

    public static class Normal{};

    public static class Manager extends Normal{};
    
}

普通视图仅显示姓名和年龄,经理视图可以显示全部。

Staff.java
import com.fasterxml.jackson.annotation.JsonView;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class Staff {

    @JsonView(CompanyViews.Normal.class)
    private String name;

    @JsonView(CompanyViews.Normal.class)
    private int age;

    @JsonView(CompanyViews.Manager.class)
    private String[] position;

    @JsonView(CompanyViews.Manager.class)
    private List<String> skills;

    @JsonView(CompanyViews.Manager.class)
    private Map<String, BigDecimal> salary;
JacksonExample.java
package com.mkyong;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class JacksonExample {

    public static void main(String[] args) {

        ObjectMapper mapper = new ObjectMapper();

        Staff staff = createStaff();

        try {

            // to enable pretty print
            mapper.enable(SerializationFeature.INDENT_OUTPUT);

            // normal
            String normalView = mapper
				.writerWithView(CompanyViews.Normal.class)
				.writeValueAsString(staff);

            System.out.format("Normal views\n%s\n", normalView);

            // manager
            String managerView = mapper
				.writerWithView(CompanyViews.Manager.class)
				.writeValueAsString(staff);

            System.out.format("Manager views\n%s\n", managerView);

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

    }

    private static Staff createStaff() {

        Staff staff = new Staff();

        staff.setName("mkyong");
        staff.setAge(38);
        staff.setPosition(new String[]{"Founder", "CTO", "Writer"});
        Map<String, BigDecimal> salary = new HashMap() {{
            put("2010", new BigDecimal(10000));
            put("2012", new BigDecimal(12000));
            put("2018", new BigDecimal(14000));
        }};
        staff.setSalary(salary);
        staff.setSkills(Arrays.asList("java", "python", "node", "kotlin"));

        return staff;

    }

}

输出量

Normal views
{
  "name" : "mkyong",
  "age" : 38
}

Manager views
{
  "name" : "mkyong",
  "age" : 38,
  "position" : [ "Founder", "CTO", "Writer" ],
  "skills" : [ "java", "python", "node", "kotlin" ],
  "salary" : {
    "2018" : 14000,
    "2012" : 12000,
    "2010" : 10000
  }
}

注意
阅读此Jackson @JsonView示例

8. @JsonIgnore和@JsonIgnoreProperties

默认情况下,Jackson包含所有字段,甚至包括statictransient字段。

8.1 @JsonIgnore忽略字段级别的字段。

import com.fasterxml.jackson.annotation.JsonIgnore;

public class Staff {

    private String name;
    private int age;
    private String[] position;
	
    @JsonIgnore
    private List<String> skills;
	
    @JsonIgnore
    private Map<String, BigDecimal> salary;

输出量

{
  "name" : "mkyong",
  "age" : 38,
  "position" : [ "Founder", "CTO", "Writer" ]
}

8.2 @JsonIgnoreProperties忽略类级别的字段。

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties({"salary", "position"})
public class Staff {

    private String name;
    private int age;
    private String[] position;
    private List<String> skills;
    private Map<String, BigDecimal> salary;

输出量

{
  "name" : "mkyong",
  "age" : 38,
  "skills" : [ "java", "python", "node", "kotlin" ]
}

9.常见问题

9.1 将JSON数组字符串转换为List

String json = "[{\"name\":\"mkyong\", \"age\":38}, {\"name\":\"laplap\", \"age\":5}]";

	List<Staff> list = Arrays.asList(mapper.readValue(json, Staff[].class));
	
	// or like this:
	// List<Staff> list = mapper.readValue(json, new TypeReference<List<Staff>>(){});

9.2 将JSON字符串转换为Map

String json = "{\"name\":\"mkyong\", \"age\":\"33\"}";
            
	Map<String, String> map = mapper.readValue(json, Map.class);
	
	// or like this:
	//Map<String, String> map = mapper.readValue(json, new TypeReference<Map<String, String>>(){});

	map.forEach((k, v) -> System.out.format("[key]:%s \t[value]:%s\n", k, v));

输出量

[key]:name 	[value]:mkyong
[key]:age 	[value]:33

9.3如果某些复杂的JSON结构无法轻松映射到Java类怎么办?
答:尝试使用Jackson TreeModel将JSON数据转换为JsonNode ,以便我们可以轻松地添加,更新或删除JSON节点。

参考文献

翻译自: https://mkyong.com/java/jackson-how-to-parse-json/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值