Google的gson.jar包在开发中常常使用,有一些细节的地方稍不注意就会踩到坑。这里介绍一下使用JsonElement取值所遇到的问题,避免之后再犯这种错误。
咱们先看一个例子:api
public static void main(String[] args) { JsonObject js = new JsonObject(); js.addProperty("name", "phone"); js.addProperty("price", 999); js.addProperty("type", "mi"); System.out.println("js-->" + js); String jsStr = js.toString(); System.out.println("str-->" + jsStr); System.out.println("------------------"); if("mi".equals(js.get("type"))){ System.out.println("这是小米手机"); }else{ System.out.println("这不是小米手机"); } if("mi".equals(js.get("type").toString())){ System.out.println("这是小米手机"); }else{ System.out.println("这不是小米手机"); } }
输出信息以下:spa
js-->{"name":"phone","price":999,"type":"mi"} str-->{"name":"phone","price":999,"type":"mi"} ------------------ 这不是小米手机 这不是小米手机
在JsonObject js里面,”type”对应的值应该是String类型的”mi”,那么输出信息应该是”这是小米手机”。
为何这里输出结果不是咱们预想那样呢?是否是很奇怪,感兴趣的同窗能够先本身想一想再接着往下看。debug
咱们先把if()里面的判断条件打印出来,会看到:调试
JsonElement-->"mi" JsonElement2Str-->"mi"
细心的同窗其实能够发现js.get(“type”)和type.toString()返回的都是”“mi”“(注意多了一对双引号),我当时也是经过打断点一步步调试才发现这个问题。code
难道咱们把if里面判断条件也改为”“mi”“,这样虽然知足了判断条件,但老是有点怪怪的感受。
查阅gson的api文档,会发现JsonElement还有一个getAsString()方法,因而试了一下 js.get(“type”).getAsString(),输出字符串mi,很明显这里是没有双引号的。
加上isJsonNull()防止出现null,使程序更健壮。blog
对于int、boolean、long等类型,取值方法也是相似的。以下图:coffeescript
int prc = ((JsonElement)js.get("price")).isJsonNull()? -1 : js.get("price").getAsInt(); System.out.println(prc); if(prc == 999){ System.out.println("价格只要999"); }else{ System.out.println("价格不是999"); }
例子看起来很简单,可是实际开发中若是忽视了这些问题,会花费很长时间来debug,因此仍是应该细心一点。ip