概念介绍
还是先简单说说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;
        }
    }
}

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

namespace Pixysoft.Json
{
    public class CommonJsonModel : CommonJsonModelAnalyzer
    {
        private string rawjson;

private bool isValue = false;

private bool isModel = false;

private bool isCollection = false;

internal CommonJsonModel(string rawjson)
        {
            this.rawjson = rawjson;

if (string.IsNullOrEmpty(rawjson))
                throw new Exception("missing rawjson");

rawjson = rawjson.Trim();

if (rawjson.StartsWith("{"))
            {
                isModel = true;
            }
            else if (rawjson.StartsWith("["))
            {
                isCollection = true;
            }
            else
            {
                isValue = true;
            }
        }

public string Rawjson
        {
            get { return rawjson; }
        }

public bool IsValue()
        {
            return isValue;
        }
        public bool IsValue(string key)
        {
            if (!isModel)
                return false;

if (string.IsNullOrEmpty(key))
                return false;

foreach (string subjson in base._GetCollection(this.rawjson))
            {
                CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())
                    continue;

if (model.Key == key)
                {
                    CommonJsonModel submodel = new CommonJsonModel(model.Value);

return submodel.IsValue();
                }
            }

return false;
        }
        public bool IsModel()
        {
            return isModel;
        }
        public bool IsModel(string key)
        {
            if (!isModel)
                return false;

if (string.IsNullOrEmpty(key))
                return false;

foreach (string subjson in base._GetCollection(this.rawjson))
            {
                CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())
                    continue;

if (model.Key == key)
                {
                    CommonJsonModel submodel = new CommonJsonModel(model.Value);

return submodel.IsModel();
                }
            }

return false;
        }
        public bool IsCollection()
        {
            return isCollection;
        }
        public bool IsCollection(string key)
        {
            if (!isModel)
                return false;

if (string.IsNullOrEmpty(key))
                return false;

foreach (string subjson in base._GetCollection(this.rawjson))
            {
                CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())
                    continue;

if (model.Key == key)
                {
                    CommonJsonModel submodel = new CommonJsonModel(model.Value);

return submodel.IsCollection();
                }
            }

return false;
        }

/// <summary>
        /// 当模型是对象,返回拥有的key
        /// </summary>
        /// <returns></returns>
        public List<string> GetKeys()
        {
            if (!isModel)
                return null;

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

foreach (string subjson in base._GetCollection(this.rawjson))
            {
                string key = new CommonJsonModel(subjson).Key;

if (!string.IsNullOrEmpty(key))
                    list.Add(key);
            }

return list;
        }

/// <summary>
        /// 当模型是对象,key对应是值,则返回key对应的值
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetValue(string key)
        {
            if (!isModel)
                return null;

if (string.IsNullOrEmpty(key))
                return null;

foreach (string subjson in base._GetCollection(this.rawjson))
            {
                CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())
                    continue;

if (model.Key == key)
                    return model.Value;
            }

return null;
        }

/// <summary>
        /// 模型是对象,key对应是对象,返回key对应的对象
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public CommonJsonModel GetModel(string key)
        {
            if (!isModel)
                return null;

if (string.IsNullOrEmpty(key))
                return null;

foreach (string subjson in base._GetCollection(this.rawjson))
            {
                CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())
                    continue;

if (model.Key == key)
                {
                    CommonJsonModel submodel = new CommonJsonModel(model.Value);

if (!submodel.IsModel())
                        return null;
                    else
                        return submodel;
                }
            }

return null;
        }

/// <summary>
        /// 模型是对象,key对应是集合,返回集合
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public CommonJsonModel GetCollection(string key)
        {
            if (!isModel)
                return null;

if (string.IsNullOrEmpty(key))
                return null;

foreach (string subjson in base._GetCollection(this.rawjson))
            {
                CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())
                    continue;

if (model.Key == key)
                {
                    CommonJsonModel submodel = new CommonJsonModel(model.Value);

if (!submodel.IsCollection())
                        return null;
                    else
                        return submodel;
                }
            }

return null;
        }

/// <summary>
        /// 模型是集合,返回自身
        /// </summary>
        /// <returns></returns>
        public List<CommonJsonModel> GetCollection()
        {
            List<CommonJsonModel> list = new List<CommonJsonModel>();

if (IsValue())
                return list;

foreach (string subjson in base._GetCollection(rawjson))
            {
                list.Add(new CommonJsonModel(subjson));
            }

return list;
        }

/// <summary>
        /// 当模型是值对象,返回key
        /// </summary>
        private string Key
        {
            get
            {
                if (IsValue())
                    return base._GetKey(rawjson);

return null;
            }
        }
        /// <summary>
        /// 当模型是值对象,返回value
        /// </summary>
        private string Value
        {
            get
            {
                if (!IsValue())
                    return null;

return base._GetValue(rawjson);
            }
        }
    }
}

使用方法

public CommonJsonModel DeSerialize(string json)
{
 return new CommonJsonModel(json);
}

超级简单,只要new一个通用对象,把json字符串放进去就行了。

针对上文的3个例子,我给出3种使用方法:
{"total":0}

CommonJsonModel model = DeSerialize(json);

model.GetValue("total") // return 0

{"total":0,"data":{"377149574" : 1}} 
CommonJsonModel model = DeSerialize(json);

model.GetModel("data").GetValue("377149574") //return 1

{"total":0,"data":{"377149574":[{"cid":"377149574"}]}}

CommonJsonModel model = DeSerialize(json);
model.GetCollection("377149574").GetCollection()[0].GetValue("cid") //return 377149574
这个有点点复杂,
1. 首先377149574代表了一个集合,所以要用model.GetCollection("377149574")把这个集合取出来。
2. 其次这个集合里面包含了很多对象,因此用GetColllection()把这些对象取出来
3. 在这些对象List里面取第一个[0],表示取了":{"cid":"377149574"}这个对象,然后再用GetValue("cid")把对象的值取出来。

ASP.NET JSON(转http://www.360doc.com/content/14/0615/21/18155648_386887590.shtml)的更多相关文章

  1. http://www.360doc.com/content/14/0313/17/16070877_360315087.shtml

    http://www.360doc.com/content/14/0313/17/16070877_360315087.shtml

  2. http://www.360doc.com/content/13/0516/22/12094763_285956121.shtml

    http://www.360doc.com/content/13/0516/22/12094763_285956121.shtml

  3. http://www.360doc.com/content/12/1014/00/7471983_241330790.shtml

    http://www.360doc.com/content/12/1014/00/7471983_241330790.shtml

  4. http://www.360doc.com/content/10/1012/09/3722251_60285817.shtml

    http://www.360doc.com/content/10/1012/09/3722251_60285817.shtml http://www.docin.com/p-163063250.htm ...

  5. http://www.360doc.com/content/18/0406/16/15102180_743316618.shtml

    http://www.360doc.com/content/18/0406/16/15102180_743316618.shtml

  6. System.Thread.TImer控件——http://www.360doc.com/content/11/0812/11/1039473_139824496.shtml

    http://www.360doc.com/content/11/0812/11/1039473_139824496.shtml

  7. http://www.360doc.com/content/10/0928/12/11991_57014502.shtml

    http://www.360doc.com/content/10/0928/12/11991_57014502.shtml

  8. C++中的memset()函数 ------------转自:http://www.360doc.com/content/10/1006/18/1704901_58866679.shtml

    memset()函数可以对大内存的分配进行很方便的操作(初始化),所谓“初始化”,当然是指将你定义的变量或申请的空间赋予你所期望的值,例如语句int i=0;就表明定义了一个变量i,并初始化为0:如果 ...

  9. Maven运行JUnit测试(http://www.360doc.com/content/13/0927/15/7304817_317455642.shtml)

    Maven单元测试 分类: maven 2012-05-09 15:17 1986人阅读 评论(1) 收藏 举报 maven测试junit单元测试javarandom   目录(?)[-] maven ...

随机推荐

  1. python 查找函数的用法

    python的导入模块:python解释器先检查当前目录下的导入的模块,如果没有找到再检查sys模块中path中的变量(import sys,sys.path),如果没有找到,就会发生错误.可以使用脚 ...

  2. hadoop 学习笔记2

    ============Hive vs Hadoop============== Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBase是为了支持弥补Ha ...

  3. fastreport好象将想合并哪个单元就将那一列的TEXT控件的Merge的属性设成True就可以了

    好象将想合并哪个单元就将那一列的TEXT控件的Merge的属性设成True就可以了 可以用FASTREPORT中的分组打印,你看一下里面的DEMO,里面都有的, 高版本的有suppressRepeat ...

  4. 转:深入理解css中position属性及z-index属性

    原文链接:https://www.cnblogs.com/zhuzhenwei918/p/6112034.html static定位是HTML元素的默认值,即没有定位,元素出现在正常的流中,因此,这种 ...

  5. Django实现邮件发送功能

    首先申请邮箱并在设置中申请到授权码,授权码的目的仅仅是让你有权限发邮件,但是不能登录到邮箱进行修改,发送邮件时,可以代替密码 1,配置文件settings.py #邮件服务配置文件 EMAIL_USE ...

  6. python_flask 注册,登陆,退出思路 ---纯个人观点

    1注册逻辑首先查询数据库用户名 并判断用户是否存在,如不存在就插入数据 并返回响应给前端2前端模板获取注册信息 判断 用户名不能为空及密码不能为空,和密码不一致 拼接注册url 组成get获取对象 响 ...

  7. NumPy 广播机制(Broadcasting)

    一.何为广播机制 a.广播机制是Numpy(开源数值计算工具,用于处理大型矩阵)里一种向量化数组操作方法. b.Numpy的通用函数(Universal functions) 中要求输入的两个数组sh ...

  8. uarts裸机程序

    硬件平台:JZ2440 实现功能:向串口软件实现输出putchar函数 start.s   --> 设置堆栈,关闭看门狗,初始化时钟,初始化sdram init.c      -->初始化 ...

  9. 第二章 深入C#数据类型

    深入C#数据类型       巧记:值(无ref)+值=不变 值(无ref)+引=变     引(有ref)+值/引=变     1.值类型和引用类型 1.引用类型 源于system.object家族 ...

  10. es内部的多线程异步并发控制

    version元数据(1)第一次创建一个document的时候,它的_version版本号是1:以后,每次对这个document执行修改或者删除操作,都会对这个_version版本号自动加1(2)在删 ...