Java 使用 Gson 操作 JSON 数据

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;
    }
}

注:

  1. 类名随意
  2. 变量名需要严格符合 JSON 中的内容
  3. 内部类需要 static ,这里使用内部类看起来更加清晰,用继承也可以
  4. 变量 private + get/set 方法应该也可以,图方便用 public
  5. 不需要把 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 的基本用法

TAGS:  JavaJSONGson
正在加载,请稍候……