天天看點

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

雜說幾句:

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

幾天過後,回到群裡call人,發現原來js的人才一去無蹤影了,沒法隻好自己動手了。

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

在定好技術方案後,下面開始技術的分析:

前端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資料,也很容易的說:

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

        public void removetext(string removetext)

            file.writealltext(filepath, file.readalltext(filepath).replace(removetext, string.empty));

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

還是一行的說,讀完替換,然後重新寫入。

ok,和io的互動設計,相當的簡潔,也就這三個函數了,寫,讀,删除。

二:json的互動的技術解析

1:資料如何寫入:

從上面的分析上看,送出肯定是一行一行的資料,于是每次寫入都是一條json語句。

2:功能沖突:這和cyq.data.table下的mdatatable的功能有什麼沖突?

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

mdatatable有tojson功能,也有loadfromjson功能,能把資料表轉成json,也能從json解析還原成記憶體表。

那資料行有沒有tojson功能?答案,沒有!

替換方案可有?答案,有! 可以mdatarow.totable().tojson(),即轉成表格再輸出json,看似挺好。

在好之前,看一下mdatatable的tojson()輸出什麼?

格式就是這個了,前面是一些共有屬性,data内才是資料行。

如果每次把這樣的資料寫完文本,到時候讀取解析還原成表格,肯定有問題。

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

3:如何解決沖突:擴充功能,為單獨的資料行添加tojson()功能

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

隻單獨輸出:

{"id":"2","parentid":"-1","userid":"2","nickname":"dddd"<code>,"body":"aaddd","createdon":"2011-4-24 0:22:21"}</code>

<code>這樣子,重複的往後寫,感覺就省了點位元組,而且也清爽秀多。</code>

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

<code></code> 

<code>4:擴充再擴充:mdatatable.loadfromjson要支援上</code>

<code></code>

<code><code>不過這麼重複的寫單行json資料,再讀取,mdatatable是解析不了的,咋整?</code></code>

<code><code>解析不了就擴充一下,把它解析了,由于cyq.data的json,都是本人手動寫的解析。</code></code>

<code><code>是以,修改來解析這樣一行一行的資料,還是可以處理的。三改兩改就支援上了,一切很好。</code></code>

<code>現狀就是可以往txt裡寫出這麼一系列的文本了:</code>

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

<code><code>{"id":"1","parentid":"-1","userid":"1","nickname":"小樣...","body":"愛說說...有話就說&amp;quot;,第一個喲喲","createdon":"4/20/2011 8:35:10 am"}</code></code>

<code><code>{"id":"2","parentid":"-1","userid":"2","nickname":"路過秋天","body":"不知道怎麼回事說,随便來幾字,明字何期多。","createdon":"4/20/2011 8:37:35 am"}</code></code>

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

<code>再然後就是mdatatable.loadfromjson又可以從這種格式還原成記憶體表了。</code>

<code>技術手段到了這裡,光明燦爛了。</code>

<code>一切流程很好:</code>

<code><code>1:用戶端送出資料-》</code></code>

<code><code>2:ashx送出資料-》寫入記憶體表,然後把資料行tojson寫入文本。</code></code>

<code><code>3:記憶體表在記憶體,總有失效的時候,失效時loadfromjson又還原成表格,又繼續。</code></code>

<code>5:另一個重大的技術問題</code>

一切看似很好,可是後面還是會有些問題呢的,什麼問題?往下看:

看一下表格的原始屬性:

内在表定義:        private static mdatatable _table = null;//記憶體資料表

表格的基本列:

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

                        _table.columns.add("id", sqldbtype.int);//id辨別

                        _table.columns.add("parentid", sqldbtype.int);//&gt;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);//建立日期

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

問題:

在開始定義前,都是有不同的類型的,但如果内在表失效時,重新還原又是什麼狀況?

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

由于json全是字元串,在還原為記憶體表mdatatable時,預設全都置為sqldbtype.nvarchar,

于是表格的字段類型全變字元串了,如果隻是還原後用于綁定顯示就沒啥問題了,如果此表格還需要進行一些複雜判斷比較,就比較糾結了。

正如我要查詢id&gt;數字的行,全是字元串就真的很糾結。

"愛說說"技術原理:與TXT互動及MDataTable對Json的功能擴充(二)

如何解決?

想法一:有想法不是辦法:

開始糾結還原後的資料類型問題,通過判斷第一行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等。

下節解說,敬請期待。

繼續閱讀