Day 27 - [Android APP] 05-API与物件

昨天讲的是 API 传递资料的流程,今天就来介绍怎麽把资料包装成物件,方便传递吧。

一样,会使用 JSON 结构比较简单的 CategoryRepository 来作范例。

写法演变

在还没有用物件操作资料以前,我们的专案都是用 ArrayList<HashMap<String, String>> 来储存资料的。

大概会像这样:

ArrayList<HashMap<String, String>> categoryList = new ArrayList<>();
try {
    JSONObject json = new JSONObject(response);
    JSONArray categories = json.getJSONArray("categories");

    for (int i = 0; i < categories.length(); i++) {
        JSONObject category = categories.getJSONObject(i);

        HashMap<String, String> category = new HashMap<>();
        category.put("id", category.getString("id"));
        category.put("name", category.getString("name"));

        categoryList.add(category);
    }
    callback.onSuccess(categoryList);
} catch (JSONException e) {
    callback.onFail("发生一些错误\n" + e.getLocalizedMessage());
}

一开始这是简单又方便的解决方式,不需要自己建立物件。试想,若是栏位变多了之後呢?

在不同 Class 中传递物件时,你需要一直对照、复制贴上,确认两边的 key 是一致的、数量是一致的,而且 IDE 不会自动帮你补齐!!若是今天有不同格式的资料,但型态却都是一样的 ArrayList<HashMap<String, String>>,那又要如分辨呢?

所以後来我才渐渐改成使用物件来包装传递资料,可以为物件设置 Constructor,或是每个栏位的 getter、setter,这样就能使用 IDE 的全功能罗。而且传递物件的时候就能清楚的知道,物件里面装的是什麽内容。甚至是 Chat 这种比较复杂(里面还有包一个 ArrayList)的资料结构,也能轻松存取。

chat

程序码

好了,那来介绍一下物件的建立吧!!

JSON 格式是这样的,可以观察一下,其实每个物件都是由 idname 组成的。

{ 
    "categories": [ 
        { 
            "id": 0, 
            "name": "全部" 
        }, 
        { 
            "id": 1, 
            "name": "长照据点与机构" 
        }, 
        { 
            "id": 2, 
            "name": "长照服务介绍与申请" 
        }, 
        { 
            "id": 3, 
            "name": "辅具服务" 
        }, 
        { 
            "id": 4, 
            "name": "外籍看护相关规范" 
        }, 
        { 
            "id": 5, 
            "name": "长照服务人员培训与任用" 
        } 
    ] 
}

对应到物件上,我设计了两个字串,分别来储存 idcategory

public class Category {
    private final String mId;
    private final String mName;

    public Category(String id, String name) {
        mId = id;
        mName = name;
    }

    public String getId() {
        return mId;
    }

    public String getName() {
        return mName;
    }
}

如此一来,在 Repository 就能使用物件的方式来包装资料了。可以比较一下,和前面的写法有什麽不一样哦。

ArrayList<Category> categoryList = new ArrayList<>();
try {
    JSONObject json = new JSONObject(response);
    JSONArray categories = json.getJSONArray("categories");

    for (int i = 0; i < categories.length(); i++) {
        JSONObject category = categories.getJSONObject(i);
        categoryList.add(new Category(
                category.getString("id"),
                category.getString("name")));
    }

    callback.onSuccess(categoryList);
} catch (JSONException e) {
    callback.onFail("发生一些错误\n" + e.getLocalizedMessage());
}

ActivityViewModel 中,都有使用到这个物件唷。



<<:  Day25【Web】TCP 连线与断线:三次握手、四次挥手

>>:  [DAY26] 导入 DDD 时尚未深究的问题

学习Ruby、Rails事前准备工作

专有名词 整理了我觉得该先了解的一些专有名词 wiki-物件导向程序设计、菜鸟式回答:是一种将资料,...

Day 28 - 重要的钥匙要藏好

越接近完赛越害怕自己今天到底发文了没!这几天早中晚都会反覆确认有没有发文,毕竟坚持30天写技术文章那...

Day31 ATT&CK for ICS - Inhibit Response Function(3)

T0814 Denial of Service 攻击者为了破坏设备的功能,使用阻断服务的攻击,会在短...

伸缩自如的Flask [day9] request

在这里多看一下request,在前面的几篇文章中我们已经看过了他的身影,这里我们可以看一下它不同的属...

django入门(一) — 介绍与安装开发环境

介绍 Django是一个开放原始码的Web应用框架,由Python写成。 采用了MTV(model–...