龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

ASP.NET万能JSON解析器

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
概念介绍 还是先简单说说Json的一些例子吧。注意,以下概念是我自己定义的,可以参考.net里面的TYPE的模型设计 如果有争议,欢迎提出来探讨! 1.最简单: {"total":0} total就是值,值是

概念介绍
还是先简单说说Json的一些例子吧。注意,以下概念是我自己定义的,可以参考.net里面的TYPE的模型设计
如果有争议,欢迎提出来探讨!
1.最简单:
{"total":0}
total就是值,值是数值,等于0
2. 复杂点
{"total":0,"data":{"377149574" : 1}}
total是值,data是对象,这个对象包含了"377149574"这个值,等于1
3. 最复杂
{"total":0,"data":{"377149574":[{"cid":"377149574"}]}}
total是值,data是对象,377149574是数组,这个数组包含了一些列的对象,例如{"cid":"377149574"}这个对象。

有了以上的概念,就可以设计出通用的json模型了。

万能JSON源码:

using System;
using System.Collections.Generic;
using System.Text;

namespace Pixysoft.Json
{
    public class CommonJsonModelAnalyzer
    {
        protected string _GetKey(string rawjson)
        {
            if (string.IsNullOrEmpty(rawjson))
                return rawjson;

            rawjson = rawjson.Trim();

            string[] jsons = rawjson.Split(new char[] { ':' });

            if (jsons.Length < 2)
                return rawjson;

            return jsons[0].Replace("\"", "").Trim();
        }

        protected string _GetValue(string rawjson)
        {
            if (string.IsNullOrEmpty(rawjson))
                return rawjson;

            rawjson = rawjson.Trim();

            string[] jsons = rawjson.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

            if (jsons.Length < 2)
                return rawjson;

            StringBuilder builder = new StringBuilder();

            for (int i = 1; i < jsons.Length; i++)
            {
                builder.Append(jsons[i]);

                builder.Append(":");
            }

            if (builder.Length > 0)
                builder.Remove(builder.Length - 1, 1);

            string value = builder.ToString();

            if (value.StartsWith("\""))
                value = value.Substring(1);

            if (value.EndsWith("\""))
                value = value.Substring(0, value.Length - 1);

            return value;
        }

        protected List<string> _GetCollection(string rawjson)
        {
            //[{},{}]

            List<string> list = new List<string>();

            if (string.IsNullOrEmpty(rawjson))
                return list;

            rawjson = rawjson.Trim();

            StringBuilder builder = new StringBuilder();

            int nestlevel = -1;

            int mnestlevel = -1;

            for (int i = 0; i < rawjson.Length; i++)
            {
                if (i == 0)
                    continue;
                else if (i == rawjson.Length - 1)
                    continue;

                char jsonchar = rawjson[i];

                if (jsonchar == '{')
                {
                    nestlevel++;
                }

                if (jsonchar == '}')
                {
                    nestlevel--;
                }

                if (jsonchar == '[')
                {
                    mnestlevel++;
                }

                if (jsonchar == ']')
                {
                    mnestlevel--;
                }

                if (jsonchar == ',' && nestlevel == -1 && mnestlevel == -1)
                {
                    list.Add(builder.ToString());

                    builder = new StringBuilder();
                }
                else
                {
                    builder.Append(jsonchar);
                }
            }

            if (builder.Length > 0)
                list.Add(builder.ToString());

            return list;
        }
    }
}


精彩图集

赞助商链接