4.2 JSONObject 和 GSON 解析 JSON 数据详解

本文详细介绍了在Android中使用JSONObject和GSON解析JSON数据的方法。首先,对比了JSON和XML的特点,指出JSON在体积和速度上的优势。接着,讲解了JSON的基本格式规范,并提供了JSON校验工具。在JSONObject部分,展示了如何通过getString()方法解析JSON数据。而在GSON部分,介绍了如何添加GSON依赖,使用GSON自动映射JSON字符串到对象,以及处理JSON数组的情况。文章提供了具体的代码示例和解析过程。
摘要由CSDN通过智能技术生成

点此进入:从零快速构建APP系列目录导图
点此进入:UI编程系列目录导图
点此进入:四大组件系列目录导图
点此进入:数据网络和线程系列目录导图
本节例程下载地址:WillFLowJSON

一、JSON简介

我们之前已经掌握了 XML 格式数据的解析方式,那么接下来我们要去学习一下如何解析 JSON 格式的数据,在学习之前,我们先将这两者做一个简单的比较。

XML与JSON的对比:
  • JSON和XML的数据可读性基本相同
  • JSON和XML同样拥有丰富的解析手段
  • JSON相对于XML来讲,数据的体积小
  • JSON与JavaScript的交互更加方便
  • JSON对数据的描述性比XML较差
  • JSON的速度要远远快于XML

总之,比起 XML, JSON 的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如 XML 直观。

(1)JSON 的格式规范

就像协议一样,JSON 也是有一套规范的,毕竟服务端和客户端双方一般来讲都是通过 JSON 字符串来传递数据的。

它的语法规则如下:
- 数据在“名称/值”对中;
- 数据由逗号分隔;
- 花括号保存对象;
- 方括号保存数组;

(2)JSON数据的书写格式范例
[
    { "id":"1","name":"WGH","age":"18" },
    { "id":"2","name":"WillFlow","age":"16"  }
]
(3)JSON校验工具

我们除了解析JSON还可以自己拼接JSON,当然如果你自己拼了一个JSON字符串又不知道对不对, 可以用校验工具进行校验,比如:点击这里,然后把自己拼接的JSON字符串贴上去,就可以校验正确与否了。

(4)Android给我们提供的JSON解析类

这些JSON解析类的API都存在于org.json包下,而我们用到的类有下面这些:
- JSONObject: JSON对象,可以完成Json字符串与Java对象的相互转换
- JSONArray: JSON数组,可以完成Json字符串与Java集合或对象的相互转换
- JSONStringer: JSON文本构建类,这个类可以帮助快速和便捷的创建JSON text, 每个JSONStringer实体只能对应创建一个JSON text
- JSONTokener:JSON解析类
- JSONException:JSON异常

二、用 JSONObject 解析 JSON 格式数据

首先在MainActivity中定义一个JSON 字符串常量,代码如下:
    private static final String JSON = "
包含以下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、付费专栏及课程。

余额充值