Java处理JSON

一、引言

JSON 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便;解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等。本文主要讲解gson的使用。

二、gson

2.1 gson的Maven依赖
<dependency>
	<groupId>com.google.code.gson</groupId>
	<artifactId>gson</artifactId>
	<version>2.8.5</version>
</dependency>
2.2 基础用法

gson提供了fromJson()toJson()两个直接用于解析和生成的方法。其中fromJson()方法用于解析json,toJson()用于生产json。

2.2.1 基本数据类型的解析与生成
  • 解析基本数据类型的JSON
Gson gson = new Gson();
int i = gson.fromJson("100", int.class); //100
double d = gson.fromJson("\"99.99\"", double.class);  //99.99
boolean b = gson.fromJson("true", boolean.class);     // true
String str = gson.fromJson("String", String.class);   // String
  • 基本数据类型生成JSON
Gson gson = new Gson();
String jsonNumber = gson.toJson(100);       // 100
String jsonBoolean = gson.toJson(false);    // false
String jsonString = gson.toJson("String"); //"String"
2.2.2 JavaBean类的生成与解析
  • JavaBean类
public class User {
    private String name;
    private int age;
    private String emailAddress;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User(String name, int age, String emailAddress) {
        this.name = name;
        this.age = age;
        this.emailAddress = emailAddress;
    }

    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 getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }
}
  • 把JavaBean类解析为JSON
Gson gson = new Gson();
User user = new User("gson",18);
String json = gson.toJson(user); // {"name":"gson","age":18}
  • JSON生成JavaBean类
Gson gson = new Gson();
String jsonString = "{\"name\":\"gson\",\"age\":18}";
User user = gson.fromJson(jsonString, User.class);
2.3 @SerializedName注解的使用
2.3.1 改变json字段的名称

@SerializedName注解是用来规定解析json时返回的名字。

@SerializedName("email_address")
private String emailAddress;

使用了@SerializedName注解后无论生成还是解析json都会去匹配此注解规定的名称。

2.3.2 备选属性名

为POJO字段提供备选属性名:@SerializedName注解提供了两个属性,上面用到了其中一个,别外还有一个属性alternate,接收一个String数组。

@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
private String emailAddress;
//当三个属性(email_address、email、emailAddress)都中出现任意一个时均可以得到正确的结果
//当多种情况同时出时,以最后一个出现的值为准。
2.4 Gson中使用泛型

例如:JSON字符串数组:["java","json","xml"]
当要通过Gson解析这个json时,一般有两种方式:使用数组,使用容器类(List、Map等)。

2.4.1 使用数组
Gson gson = new Gson();
String jsonArray = "[\"java\",\"json\",\"xml\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);
System.out.println(Arrays.toString(strings));
2.4.2 使用容器类

对于List将上面的代码中的 String[].class 直接改为 List.class 是不行的,对于Java来说List 和List 这俩个的字节码文件只一个那就是List.class,这是Java泛型使用时要注意的问题泛型擦除
为了解决的上面的问题,Gson提供了TypeToken来实现对泛型的支持,所以将以上的数据解析为List时需要这样写:

Gson gson = new Gson();
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());
//TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken<List<String>>() {}.getType() 而不是 new TypeToken<List<String>>().getType()
2.5 使用GsonBuilder导出null值、格式化输出、日期时间

一般情况下Gson类提供的 API已经能满足大部分的使用场景,但有时需要更多特殊、强大的功能时,这时候就引入一个新的类 GsonBuilder。 GsonBuilder从名上也能知道是用于构建Gson实例的一个类,要想改变Gson默认的设置必须使用该类配置Gson。

2.5.1使用GsonBuilder导出null值

Gson在默认情况下是不动导出值null的键的。所以必须做如下设置:

Gson gson = new GsonBuilder().serializeNulls().create();
User user = new User("gson", 18);
System.out.println(gson.toJson(user)); //{"name":"gons","age":18,"emailAddress":null}
2.5.2 格式化输出、日期时间及其它
Gson gson = new GsonBuilder()
    //序列化null
    .serializeNulls()
    // 设置日期时间格式,另有2个重载方法
    // 在序列化和反序化时均生效
    .setDateFormat("yyyy-MM-dd")
    // 禁此序列化内部类
     .disableInnerClassSerialization()
    //生成不可执行的Json(多了 )]}' 这4个字符)
    .generateNonExecutableJson()
     //禁止转义html标签
    .disableHtmlEscaping()
    //格式化输出
    .setPrettyPrinting()
    .create();
2.6 从文件从解析json与json保存到文件中
2.6.1 从文件中解析json
{"cat":"maomi","employess":[{"name":"format","pass":"language"},{"name":"country","pass":"header"}],"column":"thread"}
FileInputStream fis = new FileInputStream("json.json");
InputStreamReader in = new InputStreamReader(fis);
Gson gson = new Gson();

Map<String,Object> map = gson.fromJson(in,Map.class);
System.out.println(map);
2.6.2 把json保存到文件中去
FileOutputStream fos = new FileOutputStream("json.json");
OutputStreamWriter out = new OutputStreamWriter(fos);
Gson gson = new Gson();
User user = new User("gson",19);
gson.toJson(user,out);
out.flush();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值