ArrayList、HashTable到JSON

来源:互联网 发布:我爱你韩国知乎 编辑:程序博客网 时间:2024/05/17 07:06

学习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集合又包裹了一层,取键名为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是记录总数,用于分页,不分页则可以去掉。
源码

1 0