使用com.google.gson.Gson进行实体类与JSON转换时遇到的坑

一.、

com.google.gson.stream.MalformedJsonException

在这里插入图片描述

可能原因:

1.JSON中存在空格

eg:{"data_type" : "SQL  Server"}

2.JSON中存在空字符串

eg:{ "data_type" : "" }

解决方式:
使用toJson将gson转为json

eg:
private Gson gson = new Gson();
String fieldstr = gson.toJson(obj);  // 将gson转化为json
Systableparam systable = gson.fromJson(fieldstr , Systableparam.class);

二、

java.lang.NumberFormatException: empty String 转换异常

在这里插入图片描述

可能原因:
如图,field_id在实体中定义为Integer,接收的却是空字符串

解决方式

创建NullStringToEmptyAdapterFactory自定义处理类

创建StringAdapter继承TypeAdapter,重写方法

public class StringAdapter extends TypeAdapter<String> {

	@Override
	public String read(JsonReader arg0) throws IOException {
		// TODO Auto-generated method stub
//		if (arg0.peek() == JsonToken.NULL || "".equals(arg0.peek())) {
		if (arg0.peek() == JsonToken.NULL) {
			arg0.nextNull();
            return "";
        }
        return arg0.nextString();
	}

	@Override
	public void write(JsonWriter arg0, String arg1) throws IOException {
		// TODO Auto-generated method stub
		if (arg1 == null || "".equals(arg1)) {
			arg0.nullValue();
            return;
        }
		arg0.value(arg1);
		
	}

}

创建NullStringToEmptyAdapterFactory实现TypeAdapterFactory接口

public class NullStringToEmptyAdapterFactory implements TypeAdapterFactory {

	@Override
	public <T> TypeAdapter<T> create(Gson arg0, TypeToken<T> arg1) {
		// TODO Auto-generated method stub
		Class<T> rawType = (Class<T>) arg1.getRawType();
        if (rawType != String.class) {
            return null;
        }
        return (TypeAdapter<T>) new StringAdapter();
	}

}

使用:

eg:
	private Gson gson = 
		new GsonBuilder().serializeNulls().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();
	String sysstr = gson.toJson(obj);
	Systableparam systable = gson.fromJson(sysstr, Systableparam.class);

【其他】

转为自定义的List<Object>

eg:
List<Systableparam> fiellist = 
	gson.fromJson(sysstr, new TypeToken<List<Systableparam>>() {}.getType());

当map中值为null时保留该键值对

//将 new Gson() 改为 new GsonBuilder().serializeNulls().create()

Gson gson = new GsonBuilder().serializeNulls().create();

猜你喜欢

转载自blog.csdn.net/weixin_42547014/article/details/107352115