使用Gson中的JsonElement所遇到的坑

本文探讨了在使用Google Gson库中的JsonElement获取值时可能遇到的问题。通过一个示例展示了当尝试从JsonObject中获取字符串时,由于JsonElement的特性导致的意外结果。通过打印和调试,作者发现get("type")返回的字符串带有引号,而getAsString()则能正确返回无引号的字符串。为确保程序健壮性,建议使用getAsString()并结合isJsonNull()进行null值检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Google的gson.jar包在开发中经常使用,有一些细节的地方稍不注意就会踩到坑。这里介绍一下使用JsonElement取值所遇到的问题,避免以后再犯这种错误。
我们先看一个例子:

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("这不是小米手机");
        }
    }

输出信息如下:

js-->{"name":"phone","price":999,"type":"mi"}
str-->{"name":"phone","price":999,"type":"mi"}
------------------
这不是小米手机
这不是小米手机

在JsonObject js里面,”type”对应的值应该是String类型的”mi”,那么输出信息应该是”这是小米手机”。
为什么这里输出结果不是我们预想那样呢?是不是很奇怪,感兴趣的同学可以先自己想想再接着往下看。

我们先把if()里面的判断条件打印出来,会看到:

JsonElement-->"mi"
JsonElement2Str-->"mi"

细心的同学其实可以发现js.get(“type”)和type.toString()返回的都是”“mi”“(注意多了一对双引号),我当时也是通过打断点一步步调试才发现这个问题。

难道我们把if里面判断条件也改成”“mi”“,这样虽然满足了判断条件,但总是有点怪怪的感觉。
查阅gson的api文档,会发现JsonElement还有一个getAsString()方法,于是试了一下 js.get(“type”).getAsString(),输出字符串mi,很明显这里是没有双引号的。
getAsString
加上isJsonNull()防止出现null,使程序更健壮。

对于int、boolean、long等类型,取值方法也是类似的。如下图:

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");
        }

getAsInt

例子看起来很简单,但是实际开发中如果忽视了这些问题,会花费很长时间来debug,所以还是应该细心一点。

包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.LinkedTreeMap.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.class com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.class com.google.gson.internal.bind.SqlDateTypeAdapter.class com.google.gson.internal.bind.TimeTypeAdapter.class com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.class com.google.gson.internal.bind.TypeAdapters.class com.google.gson.reflect.TypeToken.class com.google.gson.stream.JsonReader.class com.google.gson.stream.JsonScope.class com.google.gson.stream.JsonToken.class com.google.gson.stream.JsonWriter.class com.google.gson.stream.MalformedJsonException.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值