爱说说技术原理:与TXT交互及MDataTable对Json的功能扩展(二)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:
关于爱说说在技术选型的文章见:爱说说技术原理方案的定选思考过程
 
本篇将讲述“爱说说”比较重大的技术问题点及解决手段:
 
 
杂说几句:
一开始,原本是打算在 秋式开源团队找一JS人才来引导前台页面的呈现的,毕竟本人在JS还停留在原始的编码阶段,于是当时聊了一下。
再后来,接下来几天,由于 秋式开源团队内部管理上有点小调整,还有新开任务小组的事,连续忙了几天,“爱说说”就也停了几天。
几天过后,回到群里Call人,发现原来JS的人才一去无踪影了,没法只好自己动手了。
 
在定好技术方案后,下面开始技术的分析:
 
爱说说”的逻辑:
前端html-》发送ajax请求-》后端ashx处理并返回Json-》前端接收Json并解析显示
 
从后端Ashx说起:
 
一:TXT文本交互的技术解析
 
1:数据写入:每次往文本的最后面写一条Json数据,语句很简单:
        public void AppendText(string appendText)
        {
            File.AppendAllText(FilePath, appendText);
        }
利用System.IO.File类即可轻松处理。
 
2:数据读取:内存表缓存失效时,需要重新加载TXT文本的Json数据,语句也很简单:
        public string LoadText()
        {
            return File.ReadAllText(FilePath);
        }
还是一行代码,处理简单。
 
3:删除功能:需要移除TXT文本内的某行Json数据,也很容易的说:
        public void RemoveText(string removeText)
        {
            File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
        }
还是一行的说,读完替换,然后重新写入。
 
OK,和IO的交互设计,相当的简洁,也就这三个函数了,写,读,删除。
 
二:Json的交互的技术解析
 
1:数据如何写入:
从上面的分析上看,提交肯定是一行一行的数据,于是每次写入都是一条Json语句。
 
2:功能冲突:这和CYQ.Data.Table下的MDataTable的功能有什么冲突?
MDataTable有ToJson功能,也有LoadFromJson功能,能把数据表转成Json,也能从Json解析还原成内存表。
那数据行有没有ToJson功能?答案,没有!
替换方案可有?答案,有! 可以MDataRow.ToTable().ToJson(),即转成表格再输出Json,看似挺好。
在好之前,看一下MDataTable的ToJson()输出什么?
{"count":"2","error":"","success":"true","data":[
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd","Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"},
{"ID":"1","ParentID":"-1","UserID":"1","NickName":"dddd","Body":"aaaaa","CreatedOn":"2011-4-24 1:19:37"}]}
格式就是这个了,前面是一些共有属性,data内才是数据行。
如果每次把这样的数据写完文本,到时候读取解析还原成表格,肯定有问题。
 
3:如何解决冲突:扩展功能,为单独的数据行添加ToJson()功能
只单独输出:
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"dddd" ,"Body":"aaddd","CreatedOn":"2011-4-24 0:22:21"}
这样子,重复的往后写,感觉就省了点字节,而且也清爽秀多。
 
4:扩展再扩展:MDataTable.LoadFromJson要支持上
不过这么重复的写单行Json数据,再读取,MDataTable是解析不了的,咋整?
解析不了就扩展一下,把它解析了,由于CYQ.Data的Json,都是本人手动写的解析。
所以,修改来解析这样一行一行的数据,还是可以处理的。三改两改就支持上了,一切很好。
 
现状就是可以往TXT里写出这么一系列的文本了:
{"ID":"1","ParentID":"-1","UserID":"1","NickName":"小样...","Body":"爱说说...有话就说",第一个哟哟","CreatedOn":"4/20/2011 8:35:10 AM"}
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"路过秋天","Body":"不知道怎么回事说,随便来几字,明字何期多。","CreatedOn":"4/20/2011 8:37:35 AM"}
再然后就是MDataTable.LoadFromjson又可以从这种格式还原成内存表了。
 
技术手段到了这里,光明灿烂了。
 
一切流程很好:
1:客户端提交数据-》
2:Ashx提交数据-》写入内存表,然后把数据行ToJson写入文本。
3:内存表在内存,总有失效的时候,失效时LoadFromJson又还原成表格,又继续。
 
5:另一个重大的技术问题
一切看似很好,可是后面还是会有些问题呢的,什么问题?往下看:
 
看一下表格的原始属性:
内在表定义:         private static MDataTable _Table = null;//内存数据表
 
表格的基本列:
                        _Table.Columns.Add("ID", SqlDbType.Int);//ID标识
                        _Table.Columns.Add("ParentID", SqlDbType.Int);//>0说明是回贴
                        _Table.Columns.Add("UserID", SqlDbType.Int);
                        _Table.Columns.Add("NickName", SqlDbType.NVarChar);
                        _Table.Columns.Add("Body", SqlDbType.NVarChar);//内容
                        _Table.Columns.Add("CreatedOn", SqlDbType.DateTime);//创建日期
 
问题:
在开始定义前,都是有不同的类型的,但如果内在表失效时,重新还原又是什么状况?
由于Json全是字符串,在还原为内存表MDataTable时,默认全都置为SqlDbType.NVarChar,
于是表格的字段类型全变字符串了,如果只是还原后用于绑定显示就没啥问题了,如果此表格还需要进行一些复杂判断比较,就比较纠结了。
正如我要查询ID>数字的行,全是字符串就真的很纠结。
 
如何解决?
 
想法一:有想法不是办法:
开始纠结还原后的数据类型问题,通过判断第一行Json的文本值,来定义设置字段类型,比如:
检测值是数字型:就Int。
检测值是日期型:就DateTime
最后就默认给:NVarChar
 
为何不是办法?
看似挺好,如果文本字段内容第一行是数字,其它行又是字符串呢?后面的内容不就纠结了?
 
想法二:有想法也是办法:
既然首行取值判断不行,如果首行存表架构呢?
首行Json字段架构如下:
{"ID":"System.Int32","ParentID":"System.Int32","UserID":"System.Int32","NickName":"System.String","Body":"System.String","CreatedOn":"System.DateTime"}
于是,解析时,就可以准确的还原了,那如何输出这行架构行?
于是,MDataColumn也多了个ToJson功能,用于输出表架构,至此,Json的交互方面,也大功告成了!
 
三:总结
 
解决了这两个重大的技术难题,接下来的,还有没有其它技术问题?
有,查询功能,即将扩展的MDataTable.Select(......)功能。
 
还有没有?
大的没了,还有就是技术细节问题了,如:接收参数,定义文本路径,定义最大行ID等。
 
下节解说,敬请期待。
 
关注点:MDataTable在“爱说说”扩展了这么多强劲的功能,啥时候发布?
很快,可能是五一前后:会在 CYQ.Data V4.5正式版中集成,也敬请期待与关注。



     本文转自cyq1162 51CTO博客,原文链接:http://blog.51cto.com/cyq1162/595592
,如需转载请自行联系原作者


相关文章
|
21天前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
31 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
3天前
|
存储 JSON 监控
公司用什么软件监控电脑:JSON 在监控信息交互中的应用探索
在现代企业管理中,电脑监控软件广泛应用于保障信息安全和提升工作效率。JSON(JavaScript Object Notation)因其简洁和易读性,在监控信息的收集、传输和处理中扮演着关键角色。本文介绍了 JSON 在监控数据结构、信息传输及服务器端处理中的具体应用,展示了其在高效监控系统中的重要性。
17 0
|
19天前
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
30 0
|
3月前
|
JSON JavaScript Java
后端程序员的前后端交互核心-JSON
后端程序员的前后端交互核心-JSON
50 6
|
3月前
|
XML JSON 前端开发
JSON与AJAX:网页交互的利器
JSON与AJAX:网页交互的利器
34 0
|
5月前
|
JSON 关系型数据库 MySQL
理解和利用MySQL中的JSON功能
理解和利用MySQL中的JSON功能
171 2
|
4月前
|
JSON 数据格式
MysbatisPlus-核心功能-IService开发基础业务接口,MysbatisPlus_Restful风格,新增@RequestBody指定是为了接收Json数据的,使用swagger必须注解
MysbatisPlus-核心功能-IService开发基础业务接口,MysbatisPlus_Restful风格,新增@RequestBody指定是为了接收Json数据的,使用swagger必须注解
|
4月前
|
JSON 数据格式
前后端数据交互----application/json数据格式和请求数据样式{“xxxx“:“xxxx“}
前后端数据交互----application/json数据格式和请求数据样式{“xxxx“:“xxxx“}
|
5月前
|
存储 JSON 关系型数据库
MySQL JSON 类型:功能与应用
MySQL JSON 类型:功能与应用
|
11天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道