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常规类型。

原文地址:https://www.cnblogs.com/huanghongbo/p/9094979.html

时间: 2024-10-03 14:05:35

Fastjson, Gson, org.json.JSON三者对于JSONObject及JSONArray的判断的相关文章

json处理简解[JSONObject、JSONArray]

json处理目前有已经成熟使用的jar能够支持相关处理,json-lib 常用方法为put.putAll.addput方法传参为:key.value/jsonObject 支持json对象赋值和包装子json串(即json串赋值中value值可以为一个json对象)putAll方法传参为:jsonObject 支持json对象赋值(将一个json对象直接赋值给另外一个)add方法传参为数组位置和数组对象add(int index, Object value) soapui使用示例: json对象

复杂json的解析:jsonobject与jsonArray的使用

String parameter = { success : 0, errorMsg : "错误消息", data : { total : "总记录数", rows : [ { id : "任务ID", workName : "任务名称", assigneeName : "经办人姓名", name : "流程步骤名称", processInstanceInitiatorName : &q

FastJson生成和解析JSON数据

生成和解析JSON数据格式的包有很多种:Gson.json-smart.FastJson.jackjson等,FastJson是一个阿里巴巴的大神开发的开源的Json处理工具包,包括"序列化"和"反序列化"两部分,号称最快.但是我认为没有最快,只有更快,只要这个功能满足我的需求,速度不错就行了,这就是我选择工具的基本标准(不是特别追求性能...). FastJson功能强大,完全支持Java Bean.集合.Map.日期.Enum,支持范型,支持自省:无依赖,能够直

FastJSON 简介及其Map/JSON/String 互转

在日志解析,前后端数据传输交互中,经常会遇到 String 与 map.json.xml 等格式相互转换与解析的场景,其中 json 基本成为了跨语言.跨前后端的事实上的标准数据交互格式.应该来说各个语言中 解析 json 的库都一大片(具体 json 格式与三方库的介绍请见:http://www.json.org/json-zh.html),比如 python 都集成在了内置库中,成为标准 API,今天我们要聊的是 java 中如何方便的使用 json 格式. 从上面的链接介绍中我们可以看到,

com.alibaba.fastjson和net.sf.json的区别

JSON有两种结构 json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构 1.对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key 获取属性值,这个属性值的类型可以是数字.字符串.数组.对象几种. 2.数组:数组在js中是中括号“[]”括起来的内容

75、JSON 解析库---FastJson, Gson

JSON 的简介: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.用于数据转换传输, 通用于PHP,Java,C++,C#,Python等编程语言数据交换传输. 易于人阅读和编写,同时也易于机器解析和生成. 基本结构:对象.数组. Gson 的简介和特点: Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. 快速.高效 代码量少

java fastjson:Map与json以及JSONObject ,JSONObject与String互转

import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject ; import com.alibaba.fastjson.JSONPath; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import java.util.Ma

fastjson生成和解析json数据,序列化和反序列化数据

本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>) 2.通过一个android程序测试fastjson的用法. fastjson简介: Fastjson是一个Java语言编写的高性能功能完善的JSON库.fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jack

Json转换利器Gson—— List to Json

Json一种非常常用的数据交换方式,又因为我们现在Web框架使用的Easyui(其中最常用的table表格绑定的Json数据),Json的应用就必不可少了,我们现在从后台数据库得到的数据常用的类型是实体和list,都属于集合,性质是一样的,从实体或者list转成Json数据传到界面就是最关键的了. 其实Java中Json的解析方式有很多种,我们可以直接使用Java的JSONObject库,除此之外还有fastjson,Gson,jackson等等这些Json处理类库,共同之处不仅方便我们开发,转