文档章节

关于Json 的泛型转换问题

Jonson
 Jonson
发布于 2016/05/12 23:09
字数 376
阅读 81
收藏 1
点赞 2
评论 0

今天写了一个关于上下拉刷新通用类 , 发现Json转换出现问题..伪代码如下:

 

 

MainActivity.java

package algorithms.qiang.com.myjson;

import android.os.Bundle;
import android.util.Log;

import algorithms.qiang.com.myjson.bean.User;

public class MainActivity extends BaseActivity<User> {




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

        String json  = getResources().getString(R.string.result_json);

        addDataList(json ,User.class);

        for (User user : dataList){

            Log.e(TAG,user.toString());

        }

    }
}

BaseActivity.java

package algorithms.qiang.com.myjson;

import android.support.v7.app.AppCompatActivity;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by qiang on 16/5/12.
 */
public class BaseActivity <T> extends AppCompatActivity {

    public static final String TAG = MainActivity.class.getSimpleName();

    protected List<T> dataList = new ArrayList<>() ;


    protected void addDataList(String json , Class<T> classOfT) {


        List resultList =   jsonToList(json,classOfT);

        dataList.addAll(resultList);

    }




    public static <T> List<T> jsonToList(String json, Class<T> classOfT) {
        Type type = new TypeToken<ArrayList<JsonObject>>(){}.getType();

        Gson gson = new Gson();
        JsonObject jsonObject =  gson.fromJson(json, JsonObject.class);
       String arrayJson =  jsonObject.getAsJsonArray("data").toString();


        ArrayList<JsonObject> jsonObjs = new Gson().fromJson(arrayJson, type);

        ArrayList<T> listOfT = new ArrayList<>();
        for (JsonObject jsonObj : jsonObjs) {
            listOfT.add(new Gson().fromJson(jsonObj, classOfT));
        }

        return listOfT;
    }
}

Result.java

package algorithms.qiang.com.myjson.bean;

import java.util.List;

/**
 * Created by qiang on 16/5/12.
 */
public class Result<T> {
    public int code;
    public String message;
    public List<T> data;
}

User.java


/**
 * Created by qiang on 16/5/12.
 */
public class User {

    public User() {
    }

    public User(String name,int age) {
        this.age = age;
        this.name = name;
    }

    public String name;
    public int age;

    @Override
    public String toString() {
        return  "user name="+name+" age="+age;
    }
}

string.xml

<resources>
    <string name="app_name">MyJson</string>

    <string name="result_json"> {"code":1,"data":[{"age":13,"name":"aaa"}],"message":"123123"}</string>
</resources>

 

当 MainActivity继承BaseActivity  , 添加List的数据时候 , 假如没有先反序列化出ArrayList<JsonObject>,然后在一个个的把JsonObject转成classOfT类型的对象 的话 会出现问题 . 因为类型的擦除 在BaseActivity 不知道你的类型是什么就会使List添加的是LinkMap这样的数据.

参考

http://blog.csdn.net/zxhoo/article/details/34856061?utm_source=tuicool&utm_medium=referral

 

© 著作权归作者所有

共有 人打赏支持
Jonson
粉丝 21
博文 131
码字总数 17942
作品 0
肇庆
Google Gson的使用方法及JSON 技术对比

一 、各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包, 包括commons-beanutils.jar,commons-collectio...

hapier
2016/11/14
130
0
java泛型操作复习,以及讲解在android中使用的场景

android使用泛型的地方很多,比如集成自BaseAdapter实现封装的Adapter,对常用操作进行封装,但是需要对传进来的数据进行处理,此时就使用到泛型,示例如下: public abstract class EasyAdap...

青莲居士
2016/01/13
854
0
codefinger/codefinger-json

#codefinger-json 程序入口 程序入口全在org.codefinger.json包中。 其中JSONUtil是程序的主要入口,这里提供了JSON序列化和反序列化的静态方法。 支持的数据类型 所有基本数据类型以及其包装...

codefinger
2017/09/13
0
0
Jackson将json字符串转换成泛型List

Jackson,我感觉是在Java与Json之间相互转换的最快速的框架,当然Google的Gson也很不错,但是参照网上有人的性能测试,看起来还是Jackson比较快一点 Jackson处理一般的JavaBean和Json之间的转...

沉默的子明
2014/10/28
0
0
Kotlin语言中的泛型设计哲学

Kotlin语言的泛型设计很有意思,但并不容易看懂。关于这个部分的官方文档,我反复看了好几次,终于弄明白Kotlin语言泛型设计的背后哲学。这篇文章将讲述Kotlin泛型设计的整个思考过程及其背后...

欧阳锋
04/16
0
0
Spring Boot Cache redis 序列化方式StringRedisSerializer和FastJsonRedisSerializer

当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedis...

xiaolyuh
2017/11/30
0
0
AutoLoadCache 4.12 发布,优化 FastJson 深度复制功能

AutoLoadCache 4.12 发布了,AutoLoadCache 是基于AOP+Annotation等技术实现的高效的缓存管理解决方案,实现缓存与业务逻辑的解耦,并增加异步刷新及“拿来主义机制”,以适应高并发环境下的...

qiujiayu
2016/07/01
2.3K
4
SharePreference保存对象与集合

转载https://blog.csdn.net/qq_21937107/article/details/79735236 在Android中我们经常需要持久化保存数据,这时可以使用文件,SharePreference,以及SQLite等。如果我想保存一个对象呢?有...

sinat_17775997
04/23
0
0
EasyIOS: 如何提升 iOS 开发效率

随着苹果发布了swift语言,很多人拿OC与之对比,下面是苹果列出的Swift几项特性(它们不包含Objective-C已经有的特性,比如自动内存管理) 类型推断(Inferred types) – 类型推断让代码更清...

墨水
2014/11/10
4.7K
5
你知道到底什么才是 Valhalla 项目么?

  【IT168 技术】近三年多以来,Valhalla项目一直是Java社区的“流行语”,但很少有关于这个重要项目的公开文章。对于一部分人来说,Valhalla项目意味着创建值类型的能力,对于另外一部分人...

it168网站
2017/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一款成功的全球服游戏该如何进行架构选型与设计?

全球服游戏如今正在成为出海游戏的主要考虑模式,跨国对战、全球通服打破国界的限制,将不同地区不同语言的玩家放在一起合作/竞技,成功吸引了大量玩家的关注,并逐渐成为主流的游戏玩法。 ...

UCloudTech
4分钟前
0
0
StringUtils类中isEmpty与isBlank的区别

org.apache.commons.lang.StringUtils类提供了String的常用操作,最为常用的判空有如下两种isEmpty(String str)和isBlank(String str)。 StringUtils.isEmpty(String str) 判断某字符串是否为...

说回答
17分钟前
0
0
react native使用redux快速上手

看例图 要求点击组件一中的按钮,改版组件二的背景色。 利用state和props和容易实现。 //app.jsimport React, {Component} from 'react';import {StyleSheet, Button, View, Text} from ...

燕归南
18分钟前
0
0
页面输出JSON格式数据

package com.sysware.utils;import java.io.IOException;import javax.servlet.ServletResponse;import org.apache.log4j.Logger;import com.sysware.SyswareConstant;pub......

AK灬
40分钟前
0
0
springCloud-2.搭建Eureka Client的使用

1.使用IDEA,Spring Initializr创建 2.填写项目资料 3.选择spring boot版本,插件选择Cloud Discovery→Eureka Discovery 4.选择保存地址 5.修改application.yml eureka: client: s...

贺小康
43分钟前
0
0
CenOS 6.5 RPM 安装 elasticsearch 6.3.1

下载 wget --no-check-certificate https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.rpm...

阿白
46分钟前
0
0
1.4 创建虚拟机&1.5 安装CentOS7&1.6 配置ip(上)&1.7 配置ip(下)

1.4 创建虚拟机 知识点 虚拟机网络链接模式 桥连 直接将虚拟网卡桥接到一个物理网卡上面。需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主...

小丑鱼00
52分钟前
0
0
TrustAsia(亚洲诚信)助力看雪2018安全开发者峰会

2018年7月21日,看雪2018安全开发者峰会在北京国家会议中心圆满落下帷幕。拥有18年悠久历史的老牌安全技术社区——看雪学院联手国内最大开发者社区CSDN,汇聚业内顶尖的安全开发者和技术专家...

亚洲诚信
53分钟前
0
0
Spring注解介绍

@Resource、@AutoWired、@Qualifier 都用来注入对象。其中@Resource可以以 name 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。 但它们有一些细微区...

lqlm
今天
0
0
32位汇编在64位Ubuntu上的汇编和连接

本教程使用的操作系统是Ubuntu Linux 18.04 LTS版本,汇编器是GNU AS(简称as),连接器是GNU LD(简称ld)。 以下是一段用于检测CPU品牌的汇编小程序(cpuid2.s): .section .dataoutput...

ryanliue
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部