日期:2014-05-16  浏览次数:20427 次

C#解析Json的类

网上转的,自己没测试过。大家有好的方法请跟帖共享,最好是要自己测试过的。

?

现在json因为轻型,越来越流行,部门内部的数据标准趋向于json,所以开始学习。

本次工作内容是要将以下数据解析成.Net可以使用的数据,返回的数据除了header,其他的都是可变的,也就是说结构不是固定的。完全由用户选择,所以选择了生成DataTable。

Json数据格式如下:

?

{"dataSet":{
"header":{
    "returnCode":"0",
    "errorInfo":"HTTP请求错误",
    "version":"V1.0R010",
    "totalRows":"2000",
    "returnRows":"20"
},
"fieldDefine":{
    "assetId":"string",
    "serverIdcId":"int",
    "inputTime":"datetime"
},
"data":{"row":[
{
    "AssetId":"TCNS2006888",
    "ServerIdcId":"1",
    "InputTime":"2008-12-12"
},
{
    "AssetId":"TCNS2006889",
    "ServerIdcId":"2",
    "InputTime":"2008-1-1"
}
]}
}
}

?

?

解析的类:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Web.Script.Serialization;

namespace Tencent.Itil.Cmsi.Common
{
    public class GeneralSearchResult
    {
        public Header header = new Header();

        private DataTable fieldDefine = new DataTable();

        /// <summary>
        /// 返回的数据结构定义,无数据
        /// </summary>
        public DataTable FieldDefine
        {
            get { return fieldDefine; }
            set { fieldDefine = value; }
        }

        private DataTable retrunData = new DataTable();

        /// <summary>
        /// 返回的数据,格式为DataTable,结构和FieldDefine中的结构一样
        /// </summary>
        public DataTable RetrunData
        {
            get { return retrunData; }
            set { retrunData = value; }
        }

        /// <summary>
        /// 将json数据转换为定义好的对象,数据转换为DataTable
        /// </summary>
        /// <param name="jsonText"></param>
        /// <returns></returns>
        public static GeneralSearchResult GetTransformData(string jsonText)
        {
            GeneralSearchResult gsr = new GeneralSearchResult();

            JavaScriptSerializer s = new JavaScriptSerializer();

            Dictionary<string, object> JsonData = (Dictionary<string, object>)s.DeserializeObject(jsonText);

            Dictionary<string, object> dataSet = (Dictionary<string, object>)JsonData["dataSet"];

            Dictionary<string, object> header = (Dictionary<string, object>)dataSet["header"];

            Dictionary<string, object> fieldDefine = (Dictionary<string, object>)dataSet["header"];

            Dictionary<string, object> data = (Dictionary<string, object>)dataSet["data"];

            object[] rows = (object[])data["row"];

            gsr.header.Version = header["version"].ToString();

            gsr.header.ErrorInfo = header["errorInfo"].ToString();

            gsr.header.ReturnCode = header["returnCode"].ToString();

            gsr.header.ReturnRows = Convert.ToInt16(header["returnRows"]);

            gsr.header.TotalRows = Convert.ToInt16(header["totalRows"]);

            Dictionary<string, object> dicFieldDefine = (Dictionary<string, object>)dataSet["fieldDefine"];

            foreach (KeyValuePair<string, object> ss in dicFieldDefine)
            {
                gsr.FieldDefine.Columns.Add(ss.Key, typeof(string));
            }

            gsr.RetrunData = gsr.FieldDefine.Clone();

            foreach (object ob in rows)
            {
                Dictionary<string, object> val = (Dictionary<string, object>)ob;

                DataRow dr = gsr.RetrunData.NewRow();

                foreach (KeyValuePair<string, object> sss in val)
                {
                    dr[sss.Key] = sss.Value;
                }
                gsr.RetrunData.Rows.Add(dr);
            }
            return gsr;
        }

        /// <summary>
        /// 数据文件头定义
        /// </summary>
        public class Header
        {
            private string version;

            /// <summary>
            /// 版本