JSON解析工具Gson和FastJson的使用
一.导入jar包(fastjson和gson)(IDEA中实现)
从官网下载jar包:
fastjson下载网址:https://github.com/alibaba/fastjson
gson下载网址:https://github.com/google/gson
在项目中导入下载的jar包
这样相当于新建了一个类库,可以在项目中使用Gson和FastJson工具类了.
二.FastJson的使用:
下面用到的类:
class Food{
private String name,info;
private double price[];
public Food(String name, String info, double... price) {
this.name = name;
this.info = info;
this.price = price;
}
public Food() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public double[] getPrice() {
return price;
}
public void setPrice(double... rice) {
this.price = price;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Food food = (Food) o;
return Objects.equals(name, food.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public String toString() {
return "Food{" +
"name='" + name + '\'' +
", info='" + info + '\'' +
", price=" + price.toString()+
'}';
}
}
1.将对象转换为JSON字符串:
public class FastJsonTest {
public static void main(String[] args) {
Food food = new Food("番茄炒蛋","家常菜",2.5,3.0,3.5);
//1.这里直接使用JSON内的静态方法将类的实例化对象转化为Json字符串
String str = JSON.toJSONString(food);
System.out.println(str);
}
}
结果:
注意:这里结果键值对的键怎么来?方法通过反射找到了food这个实例对象中的所有get方法.比如getName()方法,结果的键"name"就是通过去掉方法名的get和将Name小写化得到的,那么值就是通过对象的getName()方法得到的.
所以就有了缺点:在实例对象方法中如果有方法名(自己创建的方法)是满足get+(首字母大写)???()的,那么转化为JSON字符串是会转换出多余代码:
如:我在Food类中加多一个方法:
public String getHaha() {
return "我是多余数据!";
}
那么结果会变成:
2.将JSON字符串转换为对象:
String str1 = "{\"name\":\"番茄炒蛋\",\"info\":\"家常菜\",\"price\":[2.5,3.0,3.5]}";
Food food1 = JSON.parseObject(str1, Food.class);
System.out.println(food1.getName());
结果:
当JSON字符串里包含多个对象,可以使用这个方法:
List<类型> list=JSON.parseArray(JSON字符串,类型.class);
注意:
1.这里Food类如果是内部类就必须声明为静态内部类.
2.这里是通过类中的set方法和无参构造器来实现的,首先使用无参构造器创建了一个实例化对象,再通过set方法来赋值.赋值原理和方法名有关,转换时会将JSON字符串的键取出,如name,先将name变成Name,然后在所有的set方法里找.
如果把Food中的方法名setName()改为setname(),那么name的数据因找不到匹配项而自动忽略,属性name就不会被赋值,但不会报错.
三.Gson的使用:
1.将对象转换为JSON字符串:
public class GsonTest {
public static void main(String[] args) {
//1.创建Gson对象
Gson gson = new Gson();
Food food = new Food("番茄炒蛋","家常菜",2.5,3.0,3.5);
//2.在Tojson方法内传入类的实例化
String str = gson.toJson(food);
System.out.println(str);
}
}
结果:
这里Gson与FastJson的转换原理并不一样,不是依靠方法名,原理后续更新…
2.将JSON字符串转换为对象:
String str ="\"{\"name\":\"番茄炒蛋\",\"info\":\"家常菜\",\"price\":[2.5,3.0,3.5]}\"";
Gson gson = new Gson();
Food food = gson.fromJson(str,Food.class);
System.out.println(food.getName());
结果:
注意:
1.这里Food类如果是内部类就必须声明为静态内部类.
2.这里与FastJson的转换原理并不一样,不是依靠方法名,原理后续更新…