Gson解析JSON的方法分享

乔欣 fastjson 发布时间:2023-01-28 17:01:59 阅读数:2075 1
下文笔者讲述Gson解析json的方法及示例分享,如下所示
Gson对外提供两个方法
   toJson()和fromJson()
   用于对象和JSON之间互相转换
例:

toJson()

对象转换为json文件
 
Gson gson = new Gson(); 
// 1 java对象转json文件
gson.toJson(obj, new FileWriter("D:\\test.json"));

// 2. java对象转json字符串
String json = gson.toJson(obj);

fromJson()JSON转为Java对象

 
Gson gson = new Gson();
// 1.json文件转java对象
Object object = gson.fromJson(new FileReader("D:\\test.json"), Object.class);

// 2.json字符串转java对象
String json = "{'name' : 'java265'}";
Object object = gson.fromJson(json, Staff.class);

Gson解析JSON的示例

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.java265;
 
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

package com.java265;
 
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("d:\\test\\staff.json")) {
            gson.toJson(staff, writer);
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
 
    private static Staff createStaffObject() {
 
        Staff staff = new Staff();
 
        staff.setName("java265");
        staff.setAge(18);
        staff.setPosition(new String[]{"CIO", "CTO", "CEO"});
        Map<String, BigDecimal> salary = new HashMap() {{
            put("2010", new BigDecimal(20000));
            put("2012", new BigDecimal(88000));
            put("2018", new BigDecimal(62000));
        }};
        staff.setSalary(salary);
        staff.setSkills(Arrays.asList("java", "python", "node", "kotlin"));
 
        return staff;
 
    }
 
}
 

4. JSON到Java对象 

package com.java265;
 
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("d:\\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='java265', age=18, position=[CIO,CTO,CEO], skills=[java, python, node, kotlin], salary={2018=62000, 2012=88000, 2010=20000}}

Gson输出美化后的JSON

 
package com.java265;
import com.google.gson.Gson;
public class GsonExample3 {
    public static void main(String[] args) {
        // compact print
        Gson gson = new Gson();
        String[] lang = {"Java", "Node", "C#", "JavaScript"};
        String json = gson.toJson(lang);
        System.out.println(json);   
    }
}
 
----运行以上代码,将输出以下信息----
["Java","Node","C#","JavaScript"]

//美化后的输出打印
GsonExample4.java

package com.java265;
 
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", "C#", "JavaScript"};
        String json = gson.toJson(lang);
 
        System.out.println(json);
    }
}
----运行以上代码,将输出以下信息-----
[
  "Java",
  "Node",
  "C#",
  "JavaScript"
]

Gson不参与序列化字段

GSON默认情况下,transient和static字段将不参与Gson序列化
 此时我们可以通过excludeFieldsWithModifiers方法覆盖其默认设置
 如:
   只设置static修饰的字段不参与Gson序列化
   import java.lang.reflect.Modifier;
 
	Gson gson = new GsonBuilder()
			.excludeFieldsWithModifiers(Modifier.STATIC)
			.create();
    
	设置static和transient修饰的字段不参与Gson序列化
    Gson gson = new GsonBuilder()
			.excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT)
			.create();
	
	static和transient修饰的字段参与Gson序列化
	Gson gson = new GsonBuilder()
			.excludeFieldsWithModifiers()
			.create();

使用@Expose注解字段

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": "java265",
  "age": 18
}

使用ExclusionStrategies接口实现自定义排除字段

例:
自定义注释@ExcludeField
   ExcludeField.java

package com.java265;
 
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用于定义应排除或跳过哪些字段。
package com.java265;
 
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":"java265","age":18}

空对象支持

null对象字段将被忽略
package com.java265;
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("java265");
        staff.setAge(18);
        return staff;
    }
}
----运行以上代码,将输出以下信息-----
{"name":"java265","age":18}
//显示空值的设置

Gson gson = new GsonBuilder().serializeNulls().create();
 
{"name":"java265","age":18,"position":null,"skills":null,"salary":null}

JSON字段命名设置

只需使用 @SerializedName 
    即可以自定义字段名称
public class Staff {
 
    @SerializedName("java265_name")
    private String name;

  ----将输出以下信息-----
{"java265_name":"abc"}

版本支持

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}

JSON转换为Map

package com.java265;
 
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\":\"java265\", \"age\"18}";
        Map<String, Object> map = gson.fromJson(json, new TypeToken<Map<String, Object>>() {}.getType());
        map.forEach((x, y) -> System.out.println("key : " + x + " , value : " + y));
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/fastjson/2023/5556.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者