Android开发中实用的集合形式转换

Android开发:后台数据格式转换实战
本文介绍了在Android开发中遇到的后台提供数据格式与实际需求不符的问题,以及如何通过Gsonformat创建Bean类和转换方法,将复杂格式的集合转换为所需的简洁格式,便于UI展示。

前言:

不知道大家在android开发中有没有遇到过这样情况,App客户端先开发,后台系统后开发,这会有什么不愿意遇见的情况发生呢?

App之所以可以先开发,因为我们可以先写一些复杂的UI,比如一些开发该App中的自定义控件;此时可以不用后台接口提供的数据,因为我们可以自己模拟;那好问题来了,后台系统开发完成后,发现自己模拟的数据格式,和后台接口提供的数据格式不一样(因为前后台沟通不良从而导致的),然后用后台接口提供的数据太不方便,和重写这个复杂自定义UI没差别,工作量太大,不宜采用这种方法,只能将后台提供的接口数据格式转化为自己实际需要的数据格式

ps: 这么坑爹的情况,还真被我遇见了!


开始说说我自己遇到的情况:

♥♥♥ 模拟的json数据(集合)格式,也就是实际我需要的json数据(集合)格式是如下图显示的这样 —【集合①】

[
  {
    "x":1,
    "y":["xx:xx","xx:xx","xx:xx"],
    "z":[1,1,1]
  },
  {
    "x":2,
    "y":["xx:xx","xx:xx","xx:xx","xx:xx"],
    "z":[2,2,2,2]
  },
  {
    "x":3,
    "y":["xx:xx","xx:xx"],
    "z":[3,3]
  }
]

由于接口拉下来的数据太复杂,我抽象成了比较好观看的json形式,但怕看的太抽象了,举例简单说明一下:
- x: 代表 “某日期”(int类型)
- y: 代表 “某记录的时间”(String类型)
- z: 代表 “某记录的状态”(int类型)

ps:所以我需要的是某用户某一天内的所有记录时间和记录状态。

♥♥♥ 但是实际上的json数据(集合)格式是如下图显示的这样 —【集合②】

[
    {
        "x":2,
        "y":"xx:xx",
        "z":2
    },
    {
        "x":1,
        "y":"xx:xx",
        "z":1
    },
    {
        "x":1,
        "y":"xx:xx",
        "z":1
    },
    {
        "x":2,
        "y":"xx:xx",
        "z":2
    },
    {
        "x":1,
        "y":"xx:xx",
        "z":1
    },
    {
        "x":2,
        "y":"xx:xx",
        "z":2
    },
    {
        "x":3,
        "y":"xx:xx",
        "z":3
    },
    {
        "x":3,
        "y":"xx:xx",
        "z":3
    },
    {
        "x":2,
        "y":"xx:xx",
        "z":2
    }
]

是以一条条的数据形式提供的,只有某一天的某个记录的时间和记录的状态,同一天的还有多条记录,根本没法用

ps:所以我需要从后台提供的json数据集合中每个对象中的【y】和【z】的值取出来与去重的 “ x ” 重新组合成一个新的字典,也就是上面显示的那样。


如何转换(【集合②】—>【集合①】)

1. 用Gsonformat自动生成两个bean类,一个是接口给定的已知的数据Bean类,一个是实际使用到的有jia价值的数据Bean类

/**
* 接口给定的已知的数据Bean类
*/
public class KnownBean {
    /**
     * x : 1
     * y : "xxx"
     * z : 1
     */
    private int x;
    private String y;
    private int z;
    ... ...  ... //省略Getter和Setter方法
}
/**
* 实际使用到的有jia价值的数据Bean类
*/
public class UsefulBean {

    /**
     * x : 1
     * y : ["xxx","xxx","xxx"]
     * z : [1,1,1]
     */

    private int x;
    private List<String> y;
    private List<Integer> z;

    //加一个有参的构造函数,方便之后赋值
    public UsefulBean(int x, List<String> y, List<Integer> z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
    ... ...  ... //省略Getter和Setter方法
}

2.主要定义两个集合变量

    //后台接口提供的已知数据集合
    List<KnownBean> knownBeans;
    //实际当中使用到的数据集合
    List<UsefulBean> usefulBeans;
    //模拟数据,就是后台提供的已知的json数据
    String temp= "[{\"x\":2,\"y\":\"xx:xx\",\"z\":2},{\"x\":1,\"y\":\"xx:xx\",\"z\":1},{\"x\":1,\"y\":\"xx:xx\",\"z\":1},{\"x\":2,\"y\":\"xx:xx\",\"z\":2},{\"x\":1,\"y\":\"xx:xx\",\"z\":1},{\"x\":2,\"y\":\"xx:xx\",\"z\":2},{\"x\":3,\"y\":\"xx:xx\",\"z\":3},{\"x\":3,\"y\":\"xx:xx\",\"z\":3},{\"x\":2,\"y\":\"xx:xx\",\"z\":2}]";
    //Gson工具类
    Gson gson;

3.进行一些初始化的操作

        gson = new Gson();
        knownBeans = new ArrayList<>();
        usefulBeans = new ArrayList<>();
        //把模拟数据通过Gson转化为集合
        knownBeans = gson.fromJson(temp, new TypeToken<List<KnownBean>>() {}.getType());

4.编写集合转化的具体方法

     /**
     * 集合转换 【 knownBeans ---> usefulBeans 】
     */
    public List<UsefulBean> changeList(List<KnownBean> knownBeans){
        /**
         * 1.创建一个集合 “ x_List ”,把已知的集合里每个JsonObject对象中的【x】取出来,放进新创建的集合中
         */
        List<Integer> x_List = new ArrayList<>();
        for (int i = 0; i < knownBeans.size(); i++) {
            x_List.add(knownBeans.get(i).getX());
        }

        /**
         * 2. 把集合 “ x_List ” 去重,并从小到达排序
         */
        //2.1.全部放到set集合中x
        Set x_List_sort = new HashSet();
        x_List_sort.addAll(x_List);
        //2.2.set去重后的集合全部放回集合中
        x_List.clear();
        x_List.addAll(x_List_sort);
        //2.3默认排序
        Collections.sort(x_List);

        /**
         * 3.从已知的数据集合中每个对象中的【y】和【z】取出来与 “ x_List ”中的 “ x ” 重新组合成一个新的字典
         */
        for (int i = 0; i < x_List.size(); i++) {
            usefulBeans.add(getUsefulBean(knownBeans,x_List.get(i)));
        }

        return usefulBeans;
    }

   /**
     * 从已知的数据集合中每个对象中的【y】和【z】取出来与 “ x_List ”中的 “ x ” 重新组合成一个新的字典
     */
    public UsefulBean getUsefulBean(List<KnownBean> knownBeans,int x_List) {
        //创建一个集合y,和一个集合z
        List<String> y = new ArrayList<>();
        List<Integer> z = new ArrayList<>();
        //循环遍历已给数据集合,把和新集合x值匹配的y、z加入到新创建的集合y、z中
        for (int i = 0; i < knownBeans.size(); i++) {
            if (knownBeans.get(i).getX() == x_List) {
                y.add(knownBeans.get(i).getY());
                z.add(knownBeans.get(i).getZ());
            }
        }
        //最后返回一个完整能在实际当中使用的bean
        return new UsefulBean(x_List, y, z);
    }

5.最后调用集合转换方法即可

        //开始转换
        usefulBeans = changeList(knownBeans);
        //打印Log
        KLog.json(gson.toJson(usefulBeans));


总结:

  这是实习开发过程中碰到的第一个问题,并且思考之后努力的解决了,虽然很简单,但也是个小小的进步,心里还是挺开心的。

初次创作,如有不足之处,恳请大家提出意见和建议,或者有更简单的转换方法,希望能分享给我噢,十分感谢您的阅读O(∩_∩)O

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值