Gson使用方法之Databinding

Databinding

Google json提供了一些方法用于将json字符串转换为java对象,包括继承的java对象。Gson使用名字作为关键字将json的成员匹配为java的成员。

有两种转换方法:

1. 实例化com.google.gson.Gson class,使用fromJson方法

public <T> T fromJson(JsonElement json, Type typeOfT);

2. 使用com.google.gson.GsonBuilder class,可以通过这个类来设定转换的参数和属性,然后得到Gson class进行转换


这篇教程中的json字符串来源于free music archive,其中包含了Albums class和Dataset class,每一个Dataset都是一个Album

先看一下Albums转换为json字符串的长相,定义一个Albums类

class Albums {
	public String title;
	public String message;
	public String[] errors = new String[]{};
	public String total;
	public int total_pages;
	public int page;
	public String limit;
}

public class GsonTest {
	public static void main(String[] args) {
		Albums albums = new Albums();
		albums.title = "Free Music Archive - Albums";
		albums.message = "";
		albums.total = "11259";
		albums.total_pages = 2252;
		albums.page = 1;
		albums.limit = "5";
		GsonBuilder builder = new GsonBuilder();
		Gson gson = builder.create();
		System.out.println(gson.toJson(albums));
	}
}

得到的json字符串

{"title":"Free Music Archive - Albums","message":"","errors":[],"total":"11259","total_pages":2252,"page":1,"limit":"5"}

定义Dataset类和AlbumImages类
class Dataset {
	public String album_id;
	public String album_title;
}
class AlbumImages {
	public String image_id;
	public String user_id;
}

Dataset dataset = new Dataset();
dataset.album_id = "7596";
dataset.album_title = "Album 1";
System.out.println(gson.toJson(dataset));
		
AlbumImages image = new AlbumImages();
image.image_id = "1";		
System.out.println(gson.toJson(image));

得到的json字符串

{"album_id":"7596","album_title":"Album 1"}
{"image_id":"1"}


在builder中设置在json字符串输出null

builder.serializeNulls();
{"album_id":"7596","album_title":"Album 1"}
{"image_id":"1","user_id":null}

将在dataset中加入image的list,并且在albums中加入dataset的list

在builder中设置更pretty的输出格式

builder.setPrettyPrinting().serializeNulls();
输出的结果为

{
  "title": "Free Music Archive - Albums",
  "message": "",
  "errors": [],
  "total": "11259",
  "total_pages": 2252,
  "page": 1,
  "limit": "5",
  "datasets": [
    {
      "album_id": "7596",
      "album_title": "Album 1",
      "images": [
        {
          "image_id": "1",
          "user_id": null
        }
      ]
    }
  ]
}

利用@SerializedName("name")在序列化时设定特定的名字,这里讲images改为album_images

@SerializedName("album_images")
public List<AlbumImages> images = new ArrayList<AlbumImages>();

利用setFieldNamingStrategy()方法来修改序列化后的名字

builder.setFieldNamingStrategy(new FieldNamingStrategy() {
	@Override
	public String translateName(java.lang.reflect.Field f) {
		if (f.getName().equals("albumId"))
			return "album_id";
		else
			return f.getName();
	}
});


完整的代码如下:

public class GsonTest {
	public static void main(String[] args) {
		Albums albums = new Albums();
		albums.title = "Free Music Archive - Albums";
		albums.message = "";
		albums.total = "11259";
		albums.total_pages = 2252;
		albums.page = 1;
		albums.limit = "5";
		GsonBuilder builder = new GsonBuilder();
		builder.setPrettyPrinting().serializeNulls();
		builder.setFieldNamingStrategy(new FieldNamingStrategy() {
			@Override
			public String translateName(java.lang.reflect.Field f) {
				if (f.getName().equals("albumId"))
					return "album_id";
				else
					return f.getName();
			}
		});
		Gson gson = builder.create();
		for (int i = 0; i < 2; i++)
		{
			Dataset dataset = new Dataset();
			dataset.album_id = Integer.toString(i*10+i);
			dataset.album_title = "Album " + Integer.toString(i);
			AlbumImages image = new AlbumImages();
			image.image_id = "Image_" + Integer.toString(i);
			dataset.images.add(image);
		}
		String json = gson.toJson(albums);
		Albums albumsCopy = gson.fromJson(json, Albums.class);
		System.out.println(albumsCopy.title);
		System.out.println(albumsCopy.page);
		System.out.println(albumsCopy.datasets.size());
	}
}

原文中只是将java对象序列化,在反序列化时如果遇到arraylist,直接调用fromJson()是不行的,需要用到JsonArray这个类,详情见Gson使用方法之Serializing list


原文:  Java Gson - Convert json to a java object


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值