"爱说说"技术原理:与TXT交互及MDataTable对Json的功能扩展(二)
关于爱说说在技术选型的文章见:"爱说说"技术原理方案的定选思考过程
本篇将讲述“爱说说”比较重大的技术问题点及解决手段:
杂说几句:
一开始,原本是打算在秋式开源团队找一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);
}
{
File.WriteAllText(FilePath, File.ReadAllText(FilePath).Replace(removeText, string.Empty));
}
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要支持上
所以,修改来解析这样一行一行的数据,还是可以处理的。三改两改就支持上了,一切很好。
{"ID":"1","ParentID":"-1","UserID":"1","NickName":"小样...","Body":"爱说说...有话就说 quot;,第一个哟哟","CreatedOn":"4/20/2011 8:35:10 AM"}
{"ID":"2","ParentID":"-1","UserID":"2","NickName":"路过秋天","Body":"不知道怎么回事说,随便来几字,明字何期多。","CreatedOn":"4/20/2011 8:37:35 AM"}
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等。
下节解说,敬请期待。
小伙伴解析Json解的66的,但是老板甩给他了一个txt,那么就看如何用Unity解析txt文档 小伙伴跟我说,自从看了我这篇【Unity3D日常】Unity写Json数据,以及在Unity读取、解析Json数据,潜心学习,解析Json那解析的66的,没啥压力,但是领导给了他一个txt不知道怎么解析。 我说,那你把文档发给我,我整理一篇文章,让小伙们下次遇到这个问题知道总体流程了。
【100个 Unity小知识点】 | Unity读取txt或者Json文件,包括 换行符 的方法 Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
前两天有个小伙伴问松哥,这前后端分离开发后,认证这一块到底是使用传统的 session 还是使用像 JWT 这样的 token 来解决呢? 这确实代表了两种不同的方向。
guard let url = Bundle.main.url(forResource: source/AllCountry/zh_Hans_CNCountry , withExtension: txt ), let data = Data(con...
相关文章
- Chrome 开始允许用户自己监控扩展的活动
- PHP-CPP开发扩展(一)
- Web应用扩展系列(1):架构篇(转)
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
- Linq之扩展方法
- SAP C4C的扩展字段添加到UI之后,还需要额外的步骤,才能将其添加到OData里
- 使用ABAP代码创建SAP S/4HANA系统的扩展字段
- WCF HTTP 错误 404.3 - Not Found(由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。)
- 使用扩展技术对SAP Fiori应用进行端到端的增强,一个实际案例介绍
- Chrome浏览器扩展程序的本地备份
- Android下载管理DownloadManager功能扩展和bug修改
- PostgreSQL的学习心得和知识总结(九十四)|深入理解PostgreSQL数据库开源MPP扩展Citus DDL命令下发 的实现原理
- php 不重新编译增加openssl扩展