Lab8 需要操作 JSON 格式。毕竟用处广泛,而 Java 中有许多包可以用于操作 JSON (参见:http://www.json.org/)
起初使用 org.json ,但是将对象保存为 JSON 时似乎需要将对象的每个属性都手工写入,而我的设想是自动探测对象的所有属性并写为 JSON (毕竟重复劳动)。遍寻网络无果,后来在某个角落发现 Gson 似乎可以实现。遂用之,发现功能强大。
生成 JSON
需要生成 JSON 的数据类:
public class Player {
private String name;
private int deposit;
public Player(String name, int deposit) {
this.name = name;
this.deposit = deposit;
}
}
用于生成的代码:
import com.google.gson.Gson;
Player players = new Player[2];
for (int i = 0; i < 2; i++) {
players[i] = new Player("name", i);
}
Gson gson = new Gson(); // create Gson object
String str = gson.toJson(players);
注:生成 Gson 对象除了用 new Gson()
外还有一种据说更高端的方法,反正我也不知道用处和区别就不写了
toJson
方法后的参数可以为对象,也可以为对象数组。都可以生成符合规范的 JSON 格式
读取 JSON
以从 OpenWeatherMap 的 API 返回的 JSON 为例(查询天气:http://api.openweathermap.org/data/2.5/weather?q=London,各参数可参考 http://openweathermap.org/weather-data#current)
{"id":88319,"dt":1345284000,"name":"Benghazi",
"coord":{"lat":32.12,"lon":20.07},
"main":{"temp":306.15,"pressure":1013,"humidity":44,"temp_min":306,"temp_max":306},
"wind":{"speed":1,"deg":-7},
"weather":[
{"id":520,"main":"rain","description":"light intensity shower rain","icon":"09d"},
{"id":500,"main":"rain","description":"light rain","icon":"10d"},
{"id":701,"main":"mist","description":"mist","icon":"50d"}
],
"clouds":{"all":90},
"rain":{"3h":3}}
这是一个复杂的 JSON 数据,为了读取需要先根据数据生成特定的类结构。结构如下:
public class WeatherState {
public Main main;
public List<Weather> weather;
public int id;
public static class Main {
public double temp, temp_min, temp_max;
}
public static class Weather {
public int id;
}
}
注:
- 类名随意
- 变量名需要严格符合 JSON 中的内容
- 内部类需要 static ,这里使用内部类看起来更加清晰,用继承也可以
- 变量 private + get/set 方法应该也可以,图方便用 public
- 不需要把 JSON 中所有的数据都建构出来,你建了多少就会读出来多少(这一点非常好啊)
用于读取的代码
String jsonWeather = /* 前面的 Json 数据 */;
Gson gson = new Gson(); // create gson object
WeatherState w = gson.fromJson(jsonWeather, WeatherState.class);
System.out.println(w.id);
System.out.println(w.main.temp);
System.out.println(w.weather.get(0).id);
以上即为 Gson 的基本用法