2009年3月22日 星期日

Json

官方網站:
http://www.json.org/
Json : JavaScript Object Language
----------------------------------------------------

一開始接觸到的不是Json(JavaScript Object Language),而是XML( Extensible Markup Language),使用它的原因,是為了當Server Transaction結構上有改變時希望不用重新編譯整個Server。
為什麼需要重新編譯整Server,是因為Server共同的Header file.所以,當有一隻程式的結構改變影響到了Header file那整個Server就必須重新編譯,另一方面當Server對外的結構有改變時,有影響的Sub System也需要重新編譯(光編譯和協調的時間就會花掉好幾個工作天)

方式:
我們希望當某一隻Transaction結構上改變時不用重新編譯整個Server,只需要針對改變的那個檔案做編譯,所以在結構上會使用String用來放可變的XML 內容。當結構有改變.是改變XML的內容,編譯器還是認為結構為String沒有改變。

而使用XML的語法分析必須透過DOM有轉一手的動作,在某一些開發環境沒有提供XML 語法分析而又想使用的時候,必須去找到可用的Library,會花一段去學習如何建立和使用Library的時間,且使用的Library通常長的很肥。(當然也可以自己去寫分析的程式)

到最近才知道一個好用的格式Json(JavaScript Object Language).如果只是要做為資料流的傳遞,使用Json會比XML來適當,原因是他很簡單、在傳送的字串比XML少且在分析內容時不用透過DOM轉一手,語法分析上也很容易,如果是擔心資料查詢的問題,可以結合Class、Hashtable (或.Net 2.0 之後的Directory)所include的Library不會像XML那麼一大包,且使用Json可以免除去擔心某些XML分析器Memory上處理的問題。

對於是否要存成XML的資料格式,我認為是在當這個資料有要在網頁上做呈現的資料或是大量封存的資料,我才會存成XML格式,因為我會把XML格式的資料定位在儲存的資料而不是在處理中的資料流。

XML 與 Json 格式比較





XMLJson

<information>
<fullname>Rice Lin</fullname>
<nickname>Rice</nickname>
<emailaddrs>
<address type='work'>rice@xxx.ooo.com</address>
<address type='home'>riceballs@gogo.com</address>
</emailaddrs>
<telephones>
<tel type='work'>03-1234567</tel>
<tel type='mobile'>0911000000</tel>
</telephones>
</information>

{
"fullname": "Rice Lin",
"nickname": "Rice",
"emailaddrs": [
{"type": "work", "value": "rice@xxx.ooo.com"},
{"type": "home", "value": "riceballs@gogo.com"}
],
"telephones": [
{"type": "work", "value": "03-1234567"},
{"type": "mobile", "value": "0911000000"}
]
}



目前我使用到Json是關於C#方面的程式所以使用到的是Json.NET(http://json.codeplex.com/)上的Json.NET 1.3.1(.NET 2.0)。
他提供了 .Net 2.0和.Net 3.5的版本,.Net 3.5比.Net 2.0上的使用功能更強大(主要是有用到了Linq的功能),但在考慮到使用.Net 3.5版本開發出來的元件,使用者也必需安裝.Net 3.5的Library,所以我使用.Net 2.0的版本
下載完解壓縮的的檔案裡面可以先去看他所提供的Example 都有Source Code對於學習怎麼使用Json很容易就可以上手。

我常用的是物件的轉換,這個方式大大的縮短了分解Json,處理Json的開發時間

Json轉成Hashtable(也可以是其它的Class):
string value = @"{""Name"":""Orange"", ""Price"":3.99, ""Expiry"":""01/24/2010 12:00:00""}";
Hashtable p = JavaScriptConvert.DeserializeObject(value, typeof(Hashtable)) as Hashtable;

Hashtable 轉成Json(也可以是其它的Class)
Hashtable strHashtable = new Hashtable ();
string jsonText = JavaScriptConvert.SerializeObject(strHashtable );

Json.Net 也提供了Json轉XML格式. XML轉Json
但是如果想要結和 XML轉Json再轉成Class, 需要考慮到,他定義 XML如果為屬性資料的部份在轉成Json格式會在名稱那裡帶一個"@"





XMLJson
<span class=""vevent""></span>"span":{"@class": "vevent"}

在將Json轉為Class時Json的名稱要和Class的名稱相同(那前面多帶的@就會是個問題) 下面是正常的情況





ClassJson
class dataInfo
{
string name;
string number;
}
dataInfo Info;
"Info":{
"name":"Rice",
"number":"012345"
}


沒有留言:

張貼留言