GSON是Google开发的Java API,用于转换Java对象和Json对象。
引用这个主要为了减少格式错误导致程序异常。
gson和其他现有java json类库最大的不同时gson需要序列化得实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段。
一、添加依赖
添加Google的GSON包 这里记得是在Android Studio中写的 Gradle构建的
compile 'com.google.code.gson:gson:2.6.2'
gson = new GsonBuilder()
.setLenient()// json宽松
.enableComplexMapKeySerialization()//支持Map的key为复杂对象的形式
.serializeNulls() //智能null
.setPrettyPrinting()// 调教格式
.disableHtmlEscaping() //默认是GSON把HTML 转义的
.create();
二、Gson高级使用
GsonBuilder
这里主要用到 将对象转成json字符串 记得当时手机端查询自身sqlite数据库,然后将结果拼成字符串传递给后台服务器。后台解析json,获取结果。
对象中存在null的情况,同样在字符串中体现出来。
Gson gson = new Gson();
//查询每个表 返回需要的json字符串
//CRM_PRO_DT
CRM_PRO_DT model = new CRM_PRO_DT();
CRM_PRO_DT_Dao dao = new CRM_PRO_DT_Dao(getActivity());
List<CRM_PRO_DT> list = new ArrayList<CRM_PRO_DT>();
list = dao.queryForEq("ID", SB_ID);
if (list.size() != 0) {
model.setCCBH(list.get(0).getCCBH() == null ? "" : list.get(0).getCCBH());
model.setZZRQ(list.get(0).getZZRQ() == null ? "" : list.get(0).getZZRQ());
model.setKZFS(list.get(0).getKZFS() == null ? "" : list.get(0).getKZFS());
model.setSBSYDD(list.get(0).getSBSYDD() == null ? "" : list.get(0).getSBSYDD());
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("CCBH", list.get(0).getCCBH() == null ? "" : list.get(0).getCCBH());
map.put("ZCDM", null);
String jsonstr = gson.toJson(map);
GsonBuilder gsonBuilder = new GsonBuilder();
//null也序列化出来
String jsonstr2 = gsonBuilder.serializeNulls().create().toJson(map);
String jsonstr3 = gsonBuilder.serializeNulls().create().toJson(model);
//想序列化谁就序列化谁(没有@Expose注释的属性将不会被序列化.。)
String jsonstr4 = gsonBuilder.excludeFieldsWithoutExposeAnnotation().create().toJson(model);
}
@Expose //(标有注解 才序列化)
@DatabaseField(columnName = "CCBH")
private String CCBH;
三、拼接json字符串
Gson直接解析HashMap拼接json
Gson gson = new GsonBuilder().serializeNulls().create();
HashMap<String, Object> map = new HashMap<>();
map.put("ID",list.get(i).getMYID());
map.put("JYLB",list.get(i).getJYLB());
map.put("YJ",list.get(i).getYJ());
map.put("EJ",list.get(i).getEJ());
map.put("SJ",list.get(i).getSJ());
map.put("SEQ",list.get(i).getSEQ());
map.put("SEQ_JL",list.get(i).getSEQ_JL());
map.put("JYJG","符合");
map.put("SHUJU", null);
// json += gsonBuilder.serializeNulls().create().toJson(map) + ",";
json += gson.toJson(map) + ",";
四、Gson解析 array数组
1、array数组举例:
[{"ID":1,"JYLB":"A","YJ":"1技术资料","EJ":"1.1制造资料","SJ":"液压电梯制造单位提供了以下用中文描述的出厂随机文件:(1)制造许可证明文件;","SEQ":1,"SEQ_JL":1,"JYJG":"符合","SHUJU":null},{"ID":1,"JYLB":"A","YJ":"1技术资料","EJ":"1.1制造资料","SJ":"液压电梯制造单位提供了以下用中文描述的出厂随机文件:(1)制造许可证明文件;","SEQ":1,"SEQ_JL":1,"JYJG":"符合","SHUJU":null}]
2、主要代码
首先创建model,然后将json数据转为对象,直接操作对象,不用去考虑类型转换。
fromJson方法就是下面这个方法,将一个Json数据转换为对象。
提供两个参数,分别是json字符串以及需要转换成对象的类型。
new TypeToken<List<City>>(){}.getType() 就是说要把Json数据转换成List<City>类型的结果。
Gson gson=new Gson();
List<City> rs=new ArrayList<City>();
Type type = new TypeToken<ArrayList<City>>() {}.getType();
rs=gson.fromJson(str, type);
基本的json解析,需要考虑类型的转换,而gosn创建model的时候已经考虑进去了。
// 解析json数组
JSONArray array = new JSONArray(str);
for (int i = 0; i < array.length(); i++) {
JSONObject object = (JSONObject) array.get(i);
Double positive_prob = (Double) object.get("positive_prob");
System.out.println("positive_prob:" + positive_prob);
}
因为获取到的数据类型不确定,这种方法很容易出现类型转换错误。
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
at com.baidu.ai.Sample.main(Sample.java:98)