Gson –如何解析JSON

Gson提供了简单的toJson()fromJson()方法来将Java对象转换为JSON。

toJson() – JSON的Java对象

Gson gson = new Gson();

	// 1. Java object to JSON file
	gson.toJson(obj, new FileWriter("C:\\fileName.json"));
	
	// 2. Java object to JSON string
	String json = gson.toJson(obj);

fromJson() – JSON到Java对象

Gson gson = new Gson();
	
	// 1. JSON file to Java object
	Object object = gson.fromJson(new FileReader("C:\\fileName.json"), Object.class);

	// 2. JSON string to Java object
	String json = "{'name' : 'mkyong'}";
	Object object = gson.fromJson(json, Staff.class);

1.下载Gson

pom.xml
<dependency>
		<groupId>com.google.code.gson</groupId>
		<artifactId>gson</artifactId>
		<version>2.8.5</version>
	</dependency>

2. Java对象

供以后测试。

Staff.java
package com.mkyong;

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

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 and setters
}

3. Java对象到JSON

3.1在Gson中,我们可以使用gson.toJson()将Java对象转换为JSON。

GsonExample1.java
package com.mkyong;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

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

public class GsonExample1 {

    public static void main(String[] args) {

        // pretty print
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        Staff staff = createStaffObject();

        // Java objects to String
        String json = gson.toJson(staff);

        //System.out.println(json);

        // Java objects to File
        try (FileWriter writer = new FileWriter("c:\\test\\staff.json")) {
            gson.toJson(staff, writer);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static Staff createStaffObject() {

        Staff staff = new Staff();

        staff.setName("mkyong");
        staff.setAge(35);
        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": 35,
  "position": [
    "Founder",
    "CTO",
    "Writer"
  ],
  "skills": [
    "java",
    "python",
    "node",
    "kotlin"
  ],
  "salary": {
    "2018": 14000,
    "2012": 12000,
    "2010": 10000
  }
}

4. JSON到Java对象

4.1在Gson中,我们可以使用gson.fromJson将JSON转换回Java对象。

GsonExample2.java
package com.mkyong;

import com.google.gson.Gson;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class GsonExample2 {

    public static void main(String[] args) {

        Gson gson = new Gson();

        try (Reader reader = new FileReader("c:\\test\\staff.json")) {

            // Convert JSON File to Java Object
            Staff staff = gson.fromJson(reader, Staff.class);
			
			// print staff 
            System.out.println(staff);

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

    }

}

输出量

Staff{name='mkyong', age=35, position=[Founder, CTO, Writer], skills=[java, python, node, kotlin], salary={2018=14000, 2012=12000, 2010=10000}}

5.漂亮的打印JSON

5.1默认的JSON输出是紧凑模式。

GsonExample3.java
package com.mkyong;

import com.google.gson.Gson;

public class GsonExample3 {

    public static void main(String[] args) {

        // compact print
        Gson gson = new Gson();

        String[] lang = {"Java", "Node", "Kotlin", "JavaScript"};
        String json = gson.toJson(lang);

        System.out.println(json);
        
    }

}

输出量

["Java","Node","Kotlin","JavaScript"]

5.2启用漂亮的打印。

GsonExample4.java
package com.mkyong;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GsonExample4 {

    public static void main(String[] args) {

        // pretty print
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        String[] lang = {"Java", "Node", "Kotlin", "JavaScript"};
        String json = gson.toJson(lang);

        System.out.println(json);

    }

}

输出量

[
  "Java",
  "Node",
  "Kotlin",
  "JavaScript"
]

6.排除字段

在Gson中,有很多方法可以排除某些字段。

6.1默认情况下, transientstatic字段将被排除。 我们可以通过excludeFieldsWithModifiers覆盖默认值

如果我们只想排除静态字段。

import java.lang.reflect.Modifier;

	Gson gson = new GsonBuilder()
			.excludeFieldsWithModifiers(Modifier.STATIC)
			.create();

如果我们要排除瞬态和静态字段,则默认为。

import java.lang.reflect.Modifier;

	Gson gson = new GsonBuilder()
			.excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT)
			.create();

在此配置中,将包括静态和瞬态字段。

Gson gson = new GsonBuilder()
			.excludeFieldsWithModifiers()
			.create();

6.2通过@Expose排除字段

@Expose定义要从JSON序列化和反序列化中排除的字段。 要使用@Expose ,我们需要创建Gson对象,如下所示:

Gson gson = new GsonBuilder()
			.excludeFieldsWithoutExposeAnnotation()
			.create();

如果启用了.excludeFieldsWithoutExposeAnnotation()模式,则将排除所有没有@Expose字段。 例如,

import com.google.gson.annotations.Expose;

public class Staff {

    @Expose(serialize = true, deserialize = true)
    private String name;
    @Expose
    private int age;
    @Expose(serialize = false, deserialize = true)
	
    private String[] position;              
    private List<String> skills;            
    private Map<String, BigDecimal> salary;

如果将上述Java对象转换为JSON,则输出将如下所示

{
  "name": "mkyong",
  "age": 35
}

6.3通过ExclusionStrategies ,注释,类型,字段名称等排除字段。Gson灵活。

自定义注释@ExcludeField

ExcludeField.java
package com.mkyong;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ExcludeField {
}

一个ExclusionStrategy用于定义应排除或跳过哪些字段。

CustomExclusionStrategy.java
package com.mkyong;

import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;

public class CustomExclusionStrategy implements ExclusionStrategy {

    private final Class<?> typeToSkip;

    public CustomExclusionStrategy(Class<?> typeToSkip) {
        this.typeToSkip = typeToSkip;
    }

    @Override
    public boolean shouldSkipField(FieldAttributes f) {

        // if field name 'salary`, skip
        if ("salary".equals(f.getName())) {
            return true;
        }

        // if found @ExcludeField, skip
        if (f.getAnnotation(ExcludeField.class) != null) {
            return true;
        }

        return false;
    }

    @Override
    public boolean shouldSkipClass(Class<?> clazz) {
        return (clazz == typeToSkip);
    }

}

再次检查staff对象。

Staff.java
public class Staff {


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

启用ExclusionStrategy模式。

Gson gson = new GsonBuilder()
		.setExclusionStrategies(new CustomExclusionStrategy(List.class)) // exclude all List fields.
		.create();

输出,该示例中,字段名salary@ExcludeField字段和List类型字段将被排除。

{"name":"mkyong","age":35}

7.空对象支持

null对象字段将被忽略。

GsonExample5.java
package com.mkyong;

import com.google.gson.Gson;

public class GsonExample5 {

    public static void main(String[] args) {

        Gson gson = new Gson();

        Staff staff = createStaffObject();
		
        String json = gson.toJson(staff);

        System.out.println(json);

    }

    private static Staff createStaffObject() {

        Staff staff = new Staff();

        staff.setName("mkyong");
        staff.setAge(35);
   
        return staff;

    }

}

输出量

{"name":"mkyong","age":35}

显示空值。

Gson gson = new GsonBuilder().serializeNulls().create();

输出量

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

8. JSON字段命名支持

默认

public class Staff {

    private String name;

输出量

{"name":"abc"}

具有@SerializedName自定义字段名称

public class Staff {

    @SerializedName("mkyong_name")
    private String name;

输出量

{"mkyong_name":"abc"}

9.版本支持

import com.google.gson.annotations.Since;

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

public class Staff {

    @Since(1.0)
    private String name;
	
    @Since(2.0)
    private int age;
	
    @Since(3.0)
    private String[] position;
	
    private List<String> skills;
    private Map<String, BigDecimal> salary;

在此示例中,将排除字段position (版本3)。

Gson gson = new GsonBuilder()
                .serializeNulls()
                .setVersion(2.0) // version <= 2.0 will be included.
                .create();

输出量

{"name":null,"age":0,"skills":null,"salary":null}

10.常见问题

一些常见的问题。

10.1使用TypeToken将JSON数组转换为对象列表

GsonExample4.java
package com.mkyong;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.List;

public class GsonExample4 {

    public static void main(String[] args) {

        Gson gson = new Gson();
        String json = "[{\"name\":\"mkyong\"}, {\"name\":\"laplap\"}]";
        List<Staff> list = gson.fromJson(json, new TypeToken<List<Staff>>() {}.getType());
        list.forEach(x -> System.out.println(x));

    }

}

输出量

Staff{name='mkyong', age=0, position=null, skills=null, salary=null}
Staff{name='laplap', age=0, position=null, skills=null, salary=null}

10.2将JSON转换为Map

GsonExample5.java
package com.mkyong;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.util.Map;

public class GsonExample5 {

    public static void main(String[] args) {

        Gson gson = new Gson();

        String json = "{\"name\":\"mkyong\", \"age\":33}";
        Map<String, Object> map = gson.fromJson(json, new TypeToken<Map<String, Object>>() {}.getType());
        map.forEach((x, y) -> System.out.println("key : " + x + " , value : " + y));

    }

}

输出量

key : name , value : mkyong
key : age , value : 33.0

注意
阅读更多Gson用户指南

参考文献

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值