Android中利用Gson解析Json

在Android开发中,Json是一种客户端与服务器端交互的一种语言,它语法简单,最好的是目前市面上有很便捷的轮子可以对他进行解析。例如,Gson就是google提供的一款用于解析或者生成Json的库,可以直接将Json字符串映射成对应的实体类,十分方便。下面我总结一下利用Gson解析Json的用法以及我遇到的问题。

最简单对象的解析:

例如下边这段Json字符串:

{
    text: "Love",
    img:"http://img2.imgtn.bdimg.com/it/u=2346639372,3797158284&fm=21&gp=0.jpg"
}  

如果我要解析它,可以直接定义一个对象,比如:

class LoveJson{
    String text;//这个名字要与json字符串中的相对应才能解析出来
    String img;
}

然后在需要解析的时候调用Gson来解析:

String jsonString;//待解析的json字符串
Gson gson = new Gson();
LoveJson love = gson.from(jsonString,Love.class);

短短几行就解析完了,有轮子就是如此方便。那么我们再看几种比较复杂的解析,最后,我再说下我遇到的问题以及解决方案。

其他比较复杂的解析:

嵌套类型的解析

嵌套的Json类型无非就是这样的:
{
    school:"12级一班"
    student_number:54
    {
        student_name:"zhangsan"
        id:21
    }
}

那么解析的类应该这样写:

class SchoolJson{
    String school;
    String studentNumber;
    public static class Student{
        String studentName;
        int id;
    }
}

如果你有强迫症,变量非得用驼峰命名法,那么就用注解:

class SchoolJson{
    String school;
    @SerializedName("studen_number")
    String studentNumber;
    public static class Student{
        @SerializedName("student_name")
        String studentName;
        int id;
    }
}

数组类型的解析

也是很简单的,都是一个套路,比如:

[
    {
        student_name:"zhangsan"
        id:1
    },
    {
        student_name:"lisi"
        id:2
    },
    ...
]
class Student{
    @SerializedName("student_name")
    String studentName;
    int id;
}

解析的时候可以这样:

Gson gson = new Gson();
Student[] students = gson.from(jsonString,Student[].class);

解析Json的原则

以后可能会遇见更加复杂的,比如对象里边嵌套数组,数组里边嵌套对象,对象里边又嵌套数组…所以这里边有一个原则:

当遇到对象也就是大括号的时候,写成一个对象,遇到数组的时候,可以定义成一个List<>然后再这个List<>下边定义一个表示数组元素的类(如果数组元素还是对象的话)。如此循环下去即可。

下面我举个稍微复杂点的例子:

json字符串:

{
    stories: [
        {
            images: [
              "http://pic1.zhimg.com/84dadf360399e0de406c133153fc4ab8_t.jpg"
            ],
            type: 0,
            id: 4239728,
            title: "前苏联监狱纹身百科图鉴"
        },
        {
          "type": 0,
          "id": 7086807,
          "title": "职人介绍所 ·  自闭儿童的解锁人"
        },
        {
          "images": [
            "http://pic2.zhimg.com/afecdc04983a8e261326386995150599_t.jpg"
          ],
          "type": 0,
          "id": 7066097,
          "title": "家庭的生命周期:关于「离家」"
        },
        ...
    ],
    description: "为你发现最有趣的新鲜事,建议在 WiFi 下查看",
    background: "http://pic1.zhimg.com/a5128188ed788005ad50840a42079c41.jpg",
    color: 8307764,
    name: "不许无聊",
    image: "http://pic3.zhimg.com/da1fcaf6a02d1223d130d5b106e828b9.jpg",
    editors: [
        {
            url: "http://www.zhihu.com/people/wezeit",
            bio: "微在 Wezeit 主编",
            id: 70,
            avatar: "http://pic4.zhimg.com/068311926_m.jpg",
            name: "益康糯米"
        },
        ...
    ],
    image_source: ""
}

用于解析的类可以这样写:

public class SubjectDailyContentJson{
    public List<Story> stories = new ArrayList<>();
    public static class Story implements Serializable{
        List<String> images;
        int type;
        int id;
        String title;
    }
    public String description;
    public String background;
    public int color;
    public String name;
    public String image;
    public List<Editor> editors;
    public static class Editor{
        String url;
        String bio;
        int id;
        String avator;
        String name;
    }
    @SerializedName("image_source")
    public String imageSource;
}

只要遵循那个原则,是不是很简单呢?可是最近我遇到一个问题令我很不开心,他的数组里的元素居然不是一样的样式,观察一下上边的那个json字符串,他的stories数组里边的元素的格式居然不是统一的,有的是这样:

{
            images: [
              "http://pic1.zhimg.com/84dadf360399e0de406c133153fc4ab8_t.jpg"
            ],
            type: 0,
            id: 4239728,
            title: "前苏联监狱纹身百科图鉴"
},

有的是这样:

    {
      "type": 0,
      "id": 7086807,
      "title": "职人介绍所 ·  自闭儿童的解锁人"
    }

那要怎么办呢,我蛋疼了一阵子,也终于找到了一个方法解决,他们两个的区别无非就是有没有images那个数组,那我干脆只要有的全写在我的类里边,然后将那些有可能没有的属性,我提前给他new一个值,这个样子的话,如果没有的话json解析成一个类时这个属性就为null,我们只要判断一下就可以了。你看,我那个images那个链表我就给他new了一个。

今天的Gson的用法的总结就到这里了,以后需要用到新的知识的话再做补充。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 05:26:03

Android中利用Gson解析Json的相关文章

Android中使用Gson解析JSON数据的两种方法

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组

【Android进阶】Gson解析json字符串的简单应用

在客户端与服务器之间进行数据传输,一般采用两种数据格式,一种是xml,一种是json.这两种数据交换形式各有千秋,比如使用json数据格式,数据量会比较小,传输速度快,放便解析,而采用xml数据格式,如果使用SAX解析方式,则可以一边加载一边解析,对于数据量比较大的应用,比较适合.今天主要整理一下使用Gson解析json格式字符串的简单使用. 首先,必须导入外部包 /** * * @author ZhaoKaiQiang * * @time 2014年5月4日 */ public class J

Android开发之Gson解析Json嵌套数据

Gson解析复杂的json数据 在这里介绍解析json数据的另外一种方法就是通过Gson解析,对于解析比较简单的json数据我就不介绍了来一个比较复杂一点的json数据,如下面我们要解析的一个json数据: [java] view plaincopy String json = {"a":"100","b":[{"b1":"b_value1","b2":"b_value2&qu

在android 中发送和解析json ,android处理json字符串

在我开发的应用程序,我想以JSON对象的形式将消息发送到一个Django服务器和解析来自服务器的JSON响应,并填充自对应的视图列表. 我以前对json懂一点,我想从服务器返回如下这种格式 { "post": { "username": "someusername", "message": "this is a sweet message", "image": "http://

android_使用Gson解析json数据

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海". 第三种类型是映射(mapping),也就是一个名/值对(

我的Android进阶之旅------&gt;解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

1.问题描述 首先,需要解析的Json数据类似于下面的格式: { ret: 0, msg: "normal return.", news: [ { id: "NEW2016062800875700", from: "腾讯新闻客户端", qqnews_download_url: "http://inews.qq.com/m?refer=openapi_for_xiaotiancai", articletype: "1&

Android网络之数据解析----使用Google Gson解析Json数据

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4063452.html 联系方式:[email protected] [正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                             

android之GSON解析JSON

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库. 比如: <pre name="code" class="java">public class Order { public String id; public String OrderName; @Override public String toString() { return "id:"+id+",OrderNa

使用Gson解析Json

1.Json介绍 JSON的全称是"JavaScript Object Notation",即JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式.两者的区别:因为XML虽然可以作为跨平台的数据交换格式,但是在JS中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们倾向于选择JSON来交换数据. 2.Json的两种结构 JSON有两种表示结构,对象和数