ArrayList、HashTable到JSON

学习MINIUI框架有几天了,今天算是弄明白数据传递的原理了。
要提到的两个东西是HashTable和ArrayList
HashTable 是键值对的形式,通过键来访问值。
ArrayList集合 可以说是个对象数组,像数组一样通过索引来访问值。
下面通过这段代码,做测试,来了解其原理

            public static Hashtable SearchUser(string key, int index, int size, string sortField, string sortOrder)
        {//查询语句
            string sql = string.Format(@"SELECT *,(DaySalary*WorkTime) allMoney FROM TraineeInfo WHERE (UserName LIKE '%{0}%' or IdentityCardNumber like '%{0}%')", key);
            //排序字段
            if (String.IsNullOrEmpty(sortField) == false)
            {
                if (sortOrder != "desc") sortOrder = "asc";
                sql += " order by " + sortField + " " + sortOrder;
            }
            else
            {
                sql += " order by ID desc ";
            }
            //调用查询
            DataTable dt = DBHelper.ExecuteDatatable(sql);
            //所有结果存入集合 调用dt转集合方法
            ArrayList dataall = DataTable2ArrayList(dt);
            //分页
            ArrayList data = new ArrayList();
            int start = index * size, end = start + size;
            for (int i = 0, l = dataall.Count; i < l; i++)
            {
                Hashtable record = (Hashtable)dataall[i];
                if (record == null) continue;
                if (start <= i && i < end)
                {
                    data.Add(record);
                }
            }

            Hashtable result = new Hashtable();
            result["data"] = data;
            result["total"] = dataall.Count;
            return result;//此处将返回一个哈希表,第一个键值为数据,第二个问统计信息
            //转化为json
    }    


                 /// <summary>
        /// DT转化成集合
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private static ArrayList DataTable2ArrayList(DataTable data)
        {
            ArrayList array = new ArrayList();
            for (int i = 0; i < data.Rows.Count; i++)
            {
                DataRow row = data.Rows[i];

                Hashtable record = new Hashtable();
                for (int j = 0; j < data.Columns.Count; j++)
                {
                    object cellValue = row[j];
                    if (cellValue.GetType() == typeof(DBNull))
                    {
                        cellValue = null;
                    }
                    record[data.Columns[j].ColumnName] = cellValue;
                }
                array.Add(record);
            }
            return array;
        }

在以上代码中,第16行dt的形式为:

这个就是普通的不能再普通,我们熟悉的不能再熟悉的数据表形式了,就不再解释了。
在18行 转化为ArrayList后形式为:

这是通过官方demo的一个方法转化的,可以看出,它是把一行作为一个对象写进了ArrayList,其中的每一行又都包含了列名和此行对应的值,看看 对于一行中的每个列名和值的组合 不就是哈希表的形式吗? 接着继续往下分析

在35行 将数据打包写入哈希表的第一个键值,统计信息放第二个键值后结果为:

ArrayList、HashTable到JSON_第1张图片

其实就是用哈希表对上一步的ArrayList集合又包裹了一层,取键名为data,并且又添加了一个键值对,包含的是统计信息。为什么这么做呢?为了json呀!
看看对于这个哈希表,用JSON编码后的情况
执行操作

    string json JSON.Encode(result);

结果:

{
    "data": [ { "DaySalary": 80, "Note": null, "UserName": "李22", "PhoneNumber": "120", "Sex": "0", "allMoney": 640, "HomeAddress": null, "ID": "YG0002", "Type": 0, "WorkTime": 8, "IdentityCardNumber": "123456789012345677" }, { "DaySalary": 100, "Note": null, "UserName": "张111", "PhoneNumber": "110", "Sex": "1", "allMoney": 0, "HomeAddress": null, "ID": "YG0001", "Type": 1, "WorkTime": 0, "IdentityCardNumber": "123456789012345678" } ], 
    "total": 2 }

实际情况就是,这个json由两个部分构成:

第一个是data,值为一个数组,由两个对象构成,分别代表两条数据
第二个直接是一个简单的键值对

对于MINIUI来说,给前台一个这样一个json,它就会把数据为我们加载出来,其中加入的total是记录总数,用于分页,不分页则可以去掉。
源码

你可能感兴趣的:(json,ArrayList,Hashtable,MiniUI)