JSONObject 和 GSON 解析 JSON 数据详解(转)

 

 

 

 

转载:https://www.cnblogs.com/benchao/p/7613765.html

转载:http://www.jianshu.com/p/f99de3ec063

本节例程下载地址: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 = "[\n" +
            "  {\"id\":\"1\",\"version\":\"1.5\",\"name\":\"Apple\"},\n" +
            "  {\"id\":\"2\",\"version\":\"1.6\",\"name\":\"WillFlow\"},\n" +
            "  {\"id\":\"3\",\"version\":\"1.7\",\"name\":\"WGH\"}\n" +
            "]";

这样我们就把 JSON 格式的数据准备好了,下面就开始在 Android 程序中解析这些数据。

修改 MainActivity 中的代码,如下所示:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        parseJSONWithJSONObject(JSON);
    }

    private void parseJSONWithJSONObject(String jsonData) {
        try {
            JSONArray jsonArray = new JSONArray(jsonData);
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String id = jsonObject.getString("id");
                String name = jsonObject.getString("name");
                String version = jsonObject.getString("version");
                Log.i(TAG, "id : " + id);
                Log.i(TAG, "name : " + name);
                Log.i(TAG, "version : " + version);
                Log.i(TAG, "————————————————————");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

可以看到,解析 JSON 的代码真的是非常简单,由于我们定义的是一个 JSON 数组,因此这里首先是将数据传入到了一个 JSONArray 对象中,然后循环遍历这个 JSONArray,从中取出的每一个元素都是一个 JSONObject 对象,每个 JSONObject 对象中又会包含 id、 name 和 version 这些数据。接下来只需要调用 getString() 方法将这些数据取出,并打印出来即可。

编译运行查看日志数出

 

三、用 GSON 解析 JSON 格式数据

如何你认为使用 JSONObject 来解析 JSON 数据已经非常简单了,那你就太容易满足了。谷歌提供的 GSON 开源库可以让解析 JSON 数据的工作简单到让你不敢想象的地步,那我们肯定是不能错过这个学习机会的。

首先,在Gradle中配置如下依赖:

dependencies {
    ......
    compile 'com.google.code.gson:gson:2.8.1'
}

这时候GSON框架就加载好了,我们需要手动同步一下。

如果你的 Android Studio 中没有安装GSON插件的话,可以这样安装:

 

 

完成之后重启 Android Studio 即可。

那么 GSON 库究竟是神奇在哪里呢?其实它主要就是可以将一段 JSON格式的字符串自动映射成一个对象,从而不需要我们再手动去编写代码进行解析了,比如说一段 JSON 格式的数据如下所示:

{"name":"Tom","age":20}

那我们就可以定义一个 Person 类,并加入 name 和 age 这两个字段,然后只需简单地调用如下代码就可以将 JSON 数据自动解析成一个 Person 对象了:

Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);

如果需要解析的是一段 JSON 数组会稍微麻烦一点,我们需要借助 TypeToken 将期望解析成的数据类型传入到 fromJson() 方法中,如下所示:

List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());

基本的用法就是这样,下面就让我们来真正地尝试一下。

这里我们首先准备好需要解析的JSON原始数据:

[
  {"id":"1","version":"1.5","name":"Apple"},
  {"id":"2","version":"1.6","name":"WillFlow"},
  {"id":"3","version":"1.7","name":"WGH"}
]

然后新建一个AppBean类,用于数据规范的定义:

/**
 * Created by   : WGH.
 */
public class AppBean {

}

然后在该类的任意位置“Alt + Insert”,然后选择“Gson Format”或者使用快捷键“Alt + S”

 

然后会出现这样的界面,然后把我们刚才的JSON原始数据粘贴进去后点击OK:

 

继续点击OK,你会发现此时的AppBean变成了这个样子:

/**
 * Created by   : WGH.
 */
public class AppBean {

    /**
     * id : 1
     * version : 1.5
     * name : Apple
     */
    private String id;
    private String version;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这是一个包含了id、 name 和 version 这三个字段的数据类,并且成员变量和JSON原始数据的Key值完全相同(这点尤为重要,这是采用GSON解析的必须)。

最后在 MainAcitivyt 中定义这样的方法:

    private void parseByGSON(String jsonData) {
        Gson gson = new Gson();
        List<AppBean> appList = gson.fromJson(jsonData, new TypeToken<List<AppBean>>() {}.getType());
        for (AppBean app : appList) {
            Log.i(TAG, "id : " + app.getId());
            Log.i(TAG, "name : " + app.getName());
            Log.i(TAG, "version : " + app.getVersion());
            Log.i(TAG, "————————————————————");
        }
    }

然后调用输出即可。

编译运行查看Log输出

 

这样我们就就把 XML 和 JSON 这两种数据格式最常用的几种解析方法都学习完了,在网络数据的解析方面,我们已经成功毕业了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包含以下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、付费专栏及课程。

余额充值