文档章节

Retrofit使用GSON解析JSON数据

菜鸟上路中
 菜鸟上路中
发布于 2016/04/19 00:01
字数 312
阅读 126
收藏 1

在Retrofit中默认使用GSON解析JSON数据。使用GSON将json转换为POJO对象。它默认的解析格式是这样的:

{
  "login": "basil2style",
  "id": 1285344,
  "avatar_url": "https://avatars.githubusercontent.com/u/1285344?v=3",
  "gravatar_id": "123"}


那如果JSON数据是如下内容时,该怎么去解析呢?

{"data":[{"id":1,"divisionStr":"北京","name":"北京","lng":116.39564514160156,"lat":39.92998504638672,"pinyin":"beijing"},{"id":10,"divisionStr":"","name":"上海","lng":121.48789978027344,"lat":31.249162673950195,"pinyin":"shanghai"},{"id":20,"divisionStr":"","name":"广州","lng":113.30764770507812,"lat":23.12004852294922,"pinyin":"guangzhou"},{"id":30,"divisionStr":"","name":"深圳","lng":114.02597045898438,"lat":22.54605484008789,"pinyin":"shenzhen"}}

我们想把data所对应的值中的每一项取出来,然后转换成一个个的对象。

这时候我们需要使用GsonBuilder去重新定义json数据的解析方式。

GSON提供了TypeAdapter,可以在TypeAdapterFactory中定义解析逻辑。而该题中,我只需要获得data所对应得值即可,即数组对象。

private static class ItemTypeAdapterFactory implements TypeAdapterFactory {
       
        @Override
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
            final TypeAdapter<JsonElement> elementTypeAdapter = gson.getAdapter(JsonElement.class);


            return new TypeAdapter<T>() {
                @Override
                public void write(JsonWriter out, T value) throws IOException {
                    delegate.write(out, value);
                }
                //当获取了http请求的数据后,获得data所对应的值
                @Override
                public T read(JsonReader in) throws IOException {
                    JsonElement jsonElement = elementTypeAdapter.read(in);
                    if (jsonElement.isJsonObject()) {
                        JsonObject jsonObject = jsonElement.getAsJsonObject();
                        if (jsonObject.has("data")) {
                            jsonElement = jsonObject.get("data");
                        }
                    }

                    return delegate.fromJsonTree(jsonElement);
                }

            }.nullSafe();
        }
    }

© 著作权归作者所有

共有 人打赏支持
菜鸟上路中
粉丝 1
博文 14
码字总数 7161
作品 0
浦东
私信 提问
使用Android API最佳实践

本文由 伯乐在线 - imesong 翻译自 meetme。欢迎加入Android小组。转载请参见文章末尾处的要求。 写在前面 现在,Android应用程序中集成第三方API已十分流行。应用程序都有自己的网络操作和缓...

mingxun
2014/04/17
0
0
android网络框架Retrofit

一、简介 Retrofit在OkHttp之上对网络请求、数据结果做了封装,是一款为简化网络操作推出的框架。 二、gradle依赖 compile 'com.squareup.retrofit:retrofit:2.0.0-beta1' 三、实现步骤 1.创...

席道坤
2016/11/27
74
0
HTML 解析框架--Fruit-HTML

Fruit 简单的说Fruit之于html正如Gson之于Json,它能让你以一种注解的方式来描述解析的逻辑。下面是一个例子: 1234567891011121314151617181920212223 public class FruitInfo { @Pick("di...

匿名
2017/10/23
145
0
如何对 Android 库进行依赖管理?

Android 开发人员为项目选择库的时候,考虑的因素不仅仅是功能、可用性、性能、文档丰富度和技术支持情况。他们还关心库的大小,以及要添加的方法数量。因为项目越大,依赖也越多,要把应用的...

OneAPM蓝海讯通
2016/01/13
29
0
使用Retrofit2封装适用于组件化项目的网络库

版权声明:本文为博主原创文章,未经我的允许不得转载! 转载请标明出处: http://blog.csdn.net/guiying712/article/details/74427258 ,本文出自:【张华洋的博客】 1、URL的简单构成 URL(...

guiying712
2017/07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
10
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
16
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
10
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部