java JsonObject怎么判断一个json串中是不是含有某个key值????
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java JsonObject怎么判断一个json串中是不是含有某个key值????相关的知识,希望对你有一定的参考价值。
我现在就是要解析一个json串,当中有个key值有时候会有,有时候没有,我需要判断有没有。但是JsonObject当中的get方法不行,get方法获取不到就直接抛异常了,求高手帮忙!!
代码:
json.get("key")
(括号里的是你要判断的值或者参数)
简介:
JSON(javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读,同时也方便了机器进行解析和生成。JSON简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构,其可以将JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从Web客户机传递给服务器端程序。JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。
参考技术A 使用jsonObject.containsKey(key)可以判断json中是否包含某个key,判断之后再进行取值操作。追问????????????????
追答JSONObject有个方法,containsKey,通过JSONObject的对象jsonObject.containsKey(key)就可以判断json对象里含不含这个key,key就是json里的key字符串,如果含的话,再get,不含就不get,就不会报异常了。
参考技术B json.has("key") 参考技术C 你用get方法,先别管抛不抛异常,get到就说明有,get不到就说明没有对不对?异常?好,try catch一下,解决了。追问
你逗我,不会就别乱答
追答我绝对没逗你,你把代码发上来,我给你解决
追问我已经解决了
Fastjson, Gson, org.json.JSON三者对于JSONObject及JSONArray的判断
1.Fastjson
我们通常在已知格式的情况下直接使用JSONObject,JSONArray,但是如果遇到需要判断格式呢?
try{ Object object = JSON.parse(a); if (object instanceof JSONObject){ //JSONObject } if (object instanceof JSONArray){ //JSONArray } }catch (com.alibaba.fastjson.JSONException e){ //非JSON字符串 }
2.org.json.JSON
直接使用JSON库做解析的情况不多,但是这里也稍微写一下
log.info(JSON.parse(jsonStr).getClass().getName()); try { Object json = new JSONTokener(jsonStr).nextValue(); log.info( json.getClass().toString()); // json.toString(); if(json instanceof JSONObject){ log.info("is JSONObject"); JSONObject jsonObject = (JSONObject)json; //further actions on jsonObjects //... }else if (json instanceof JSONArray){ log.info("is JSONArray"); JSONArray jsonArray = (JSONArray)json; //further actions on jsonArray //... } }catch (Exception e){ e.printStackTrace(); }
3.GSON,也是蛮强大的一个库,没有依赖包,只是在反射到Map的使用上有点麻烦。
GSON里面最有意思的就是JsonPrimitive,原始JSON。
先给代码
String str = ""; JsonParser jsonParser = new JsonParser(); try{ JsonElement jsonElement = jsonParser.parse(str); log.info("jsonElement "+jsonElement.getClass().getName()); if (jsonElement.isJsonObject()){ //JsonObject log.info(jsonElement.getAsJsonObject().get("aa").getAsString()); } if (jsonElement.isJsonArray()){ //JsonArray log.info(jsonElement.getAsJsonArray().get(0).getAsJsonObject().get("aa").getAsString()); } if (jsonElement.isJsonNull()){ //空字符串 log.info(jsonElement.getAsString()); } if (jsonElement.isJsonPrimitive()){ log.info(jsonElement.getAsString()); } }catch (Exception e){ //非法 // e.printStackTrace(); log.info("非法 "+e.getMessage()); }
可知,GSON中定义了四个JSON类型,分别是JSONObject,JSONArray,JSONPrimitive,JSONNull。
但是官方对JSON的严格定义是{}为JSONObject,[]为JSONArray。
所以只用JsonElement jsonElement = jsonParser.parse(str);能正常解析的字符串并不意味着是一个合法的JSON,必须满足
jsonElement.isJsonObject()或者jsonElement.isJsonArray()。
另说一个题外话,关于对jsonElement.getAsJsonPrimitive()方法的理解。
JsonPrimitive即时指JSON value的原始数据,包含三种类型,数字,双引号包裹的字符串,布尔。
所以JsonPrimitive.toString得到的不是实际的值,而是JSON中的:后面的完整内容,需要再做一次getAs。
例如
String str = "{\"aa\":\"aa\"}"; JsonElement jsonElement = jsonParser.parse(str); log.info(jsonElement.getAsJsonObject().get("aa").getAsString()); str = "{\"aa\":true}"; jsonElement = jsonParser.parse(str); jsonElement.getAsJsonObject().get("aa").getAsBoolean(); str = "{\"aa\":1.2}"; jsonElement.getAsJsonObject().get("aa").getAsBigDecimal();
所以Gson还有一个好处就是自带转换为java常规类型。
以上是关于java JsonObject怎么判断一个json串中是不是含有某个key值????的主要内容,如果未能解决你的问题,请参考以下文章