文档章节

关于Json 的泛型转换问题

Jonson
 Jonson
发布于 2016/05/12 23:09
字数 376
阅读 81
收藏 1

今天写了一个关于上下拉刷新通用类 , 发现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

没有更多内容

加载失败,请刷新页面

加载更多

javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
0
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
0
0
学习设计模式——中介者模式

1. 认识中介者模式 1. 定义:用一个中介对象来封装一系列的对象交互行为,中介者使得各对象不需要显式的互相引用,从而使其松散耦合,独立的改变他们之间的交互。 2. 结构: Mediator:中介者...

江左煤郎
昨天
0
0
深入理解Plasma(1):Plasma 框架

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章作为开篇,主要目的是理解 Plasma 框架。 Plasma 作为以太坊的二层扩容...

HiBlock
昨天
0
0
Java 8 日期 示例

Java 8 推出了全新的日期时间API。Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。Java也意识到需...

阿刚ABC
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部