JSON 客戶端和服務(wù)器端的格式轉(zhuǎn)換
更新時間:2009年08月27日 00:28:29 作者:
JSON是JavaScript Object Notation的縮寫。JSON是個輕量級的用于服務(wù)器端和客戶端交換數(shù)據(jù)的數(shù)據(jù)格式。它經(jīng)常會用在ajax應(yīng)用上,是因為它是基于ajax對象的格式定義出來的。
這里我們會從javascript的語法引申出json,并在此基礎(chǔ)上引出如何在ajax應(yīng)用程序上使用JSON。
在javascript大家知道有個Arrays:數(shù)組。它的格式如下:
var Beatles = [“Paul”,”John”,”George”,”Ringo”];
上面的實例一個Array的形式和下面的等價:
var Beatles =new Array [ “Paul”,”John”,”George”,”Ringo”];
再有一個就是Objects,對象的創(chuàng)建方式如下:
var Beatles = {“Country”:”England”,”YearFormed”:1959,”Style”:”Rock'n'Roll”}
上面這個創(chuàng)建方式等同于如下的創(chuàng)建方式:
var Beatles = new Object();
Beatles.Country = “England”;
Beatles.YearFormad = 1959;
Beatles.Style = “Rock'n'Roll”;
同其它javascript對象一樣,屬性能夠通過'.'或'[ ]'來表示出來。
Object可以包含Array, 如下:
var Beatles = {
“Country” :”England”,
“YeatFormed”: 1959,
“Style” : “Rock'n'Roll”,
“Members”:[ “Paul”,”John”,”George”,”Ringo”]
}
同樣也可以在Array中包含Objects:
var Rockbands =[
{
“Name”:”BeatLes”,
“County” : “England”,
“YearFormed” : 1959,
“Style” : “Rock'n'Roll”,
“Members” : [“Paul”,”John”,”George”,”Ringo”]
},
{
“Name” “ “Rolling Stones”,
“Country”:”England”,
“YearFormed”:1962,
“Style” : “Rock'n'Roll”,
“Members” :[“Mick”],”Keith”,”Charlie”,”Bill”]
}
]
在JSON的官網(wǎng)上描述JSON如下:
1. 一個輕量級的數(shù)據(jù)轉(zhuǎn)化形式。
2. 容易人們?nèi)プx和寫。
3. 容易機器去解析和生成。
JSON的語法:
JSON對于一些初級程序員可能覺得不好讀和寫,但是對于比較有經(jīng)驗的人來說還是相當(dāng)不錯的(個人觀點)。
雖然JSON和javascript的語法差不多但是它的每個對象不能夠賦值給一個變量。也就是它本身不是哥object而是個字符串。每次得到JSON時我們必須通過轉(zhuǎn)化來使用它。雖然使用javascript的eval()功能能夠?qū)崿F(xiàn)轉(zhuǎn)換,但是為了安全起見建議大家使用json.js來轉(zhuǎn)換??梢缘缴厦嫣峁┑哪莻€地址下載。它里面最基本的兩個方法:
JSON.parse(strJSON)-是用來轉(zhuǎn)化JSON字符串為JavaScript對象的、
JSON.stringify(objJSON) –用來轉(zhuǎn)化一個JavaScript對象為一個JSON對象的。
這個是客戶端的數(shù)據(jù)轉(zhuǎn)化,那么服務(wù)器端如何進(jìn)行呢?針對不同的語言會有不同的已經(jīng)非常好的轉(zhuǎn)換庫。因為本人是接近.net的所以這里介紹如何使用C#來進(jìn)行JSON的服務(wù)器端轉(zhuǎn)換。
我看一個外國大哥寫了一篇 關(guān)于在.net下如何轉(zhuǎn)化JSON的文章相當(dāng)不錯。他把JSON.NET和微軟的JavaScriptSerializer集成到一塊,這樣不管你是哪種格式的JSON基本上都能搞定了、
現(xiàn)提供個簡單的轉(zhuǎn)化JSON的生成和解析JSON的代碼:
public string Serialize(object value)
{
Type type = value.GetType();
Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();
json.NullValueHandling = NullValueHandling.Ignore;
json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
if (type == typeof(DataRow))
json.Converters.Add(new DataRowConverter());
else if(type == typeof(DataTable))
json.Converters.Add(new DataTableConverter());
else if (type == typeof(DataSet))
json.Converters.Add(new DataSetConverter());
StringWriter sw = new StringWriter();
Newtonsoft.Json.JsonTextWriter writer = new JsonTextWriter(sw);
if (this.FormatJsonOutput)
writer.Formatting = Formatting.Indented;
else
writer.Formatting = Formatting.None;
writer.QuoteChar = '"';
json.Serialize(writer, value);
string output = sw.ToString();
writer.Close();
sw.Close();
return output;
}
public object Deserialize(string jsonText, Type valueType)
{
Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();
json.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
json.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
StringReader sr = new StringReader(jsonText);
Newtonsoft.Json.JsonTextReader reader = new JsonTextReader(sr);
object result = json.Deserialize(reader, valueType);
reader.Close();
return result;
}
在NET.JSON的基礎(chǔ)上使用JavascriptSeriazible來轉(zhuǎn)換:
internal class WebExtensionsJavaScriptSerializer : JSONSerializerBase, IJSONSerializer
{
public WebExtensionsJavaScriptSerializer(JSONSerializer serializer) : base(serializer)
{}
public string Serialize(object value)
{
JavaScriptSerializer ser = new JavaScriptSerializer();
List<JavaScriptConverter> converters = new List<JavaScriptConverter>();
if (value != null)
{
Type type = value.GetType();
if (type == typeof(DataTable) || type == typeof(DataRow) || type == typeof(DataSet))
{
converters.Add(new WebExtensionsDataRowConverter());
converters.Add(new WebExtensionsDataTableConverter());
converters.Add(new WebExtensionsDataSetConverter());
}
if (converters.Count > 0)
ser.RegisterConverters(converters);
}
return = ser.Serialize(value);
}
public object Deserialize(string jsonText, Type valueType)
{
// *** Have to use Reflection with a 'dynamic' non constant type instance
JavaScriptSerializer ser = new JavaScriptSerializer();
object result = ser.GetType()
.GetMethod("Deserialize")
.MakeGenericMethod(valueType)
.Invoke(ser, new object[1] { jsonText });
return result;
}
}
internal class WebExtensionsDataTableConverter : JavaScriptConverter
{
public override IEnumerable<Type> SupportedTypes
{
get { return new Type[] {typeof (DataTable)}; }
}
public override object Deserialize(IDictionary<string, object> dictionary, Type type,
JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
下篇介紹如何在ASP.NET的環(huán)境下使用JSON和DataTable等的轉(zhuǎn)換,還有介紹使用JQuery的AJAX調(diào)用Web Services的生成JSON、相當(dāng)值得期待。^_^
在javascript大家知道有個Arrays:數(shù)組。它的格式如下:
復(fù)制代碼 代碼如下:
var Beatles = [“Paul”,”John”,”George”,”Ringo”];
上面的實例一個Array的形式和下面的等價:
復(fù)制代碼 代碼如下:
var Beatles =new Array [ “Paul”,”John”,”George”,”Ringo”];
再有一個就是Objects,對象的創(chuàng)建方式如下:
復(fù)制代碼 代碼如下:
var Beatles = {“Country”:”England”,”YearFormed”:1959,”Style”:”Rock'n'Roll”}
上面這個創(chuàng)建方式等同于如下的創(chuàng)建方式:
復(fù)制代碼 代碼如下:
var Beatles = new Object();
Beatles.Country = “England”;
Beatles.YearFormad = 1959;
Beatles.Style = “Rock'n'Roll”;
同其它javascript對象一樣,屬性能夠通過'.'或'[ ]'來表示出來。
Object可以包含Array, 如下:
復(fù)制代碼 代碼如下:
var Beatles = {
“Country” :”England”,
“YeatFormed”: 1959,
“Style” : “Rock'n'Roll”,
“Members”:[ “Paul”,”John”,”George”,”Ringo”]
}
同樣也可以在Array中包含Objects:
復(fù)制代碼 代碼如下:
var Rockbands =[
{
“Name”:”BeatLes”,
“County” : “England”,
“YearFormed” : 1959,
“Style” : “Rock'n'Roll”,
“Members” : [“Paul”,”John”,”George”,”Ringo”]
},
{
“Name” “ “Rolling Stones”,
“Country”:”England”,
“YearFormed”:1962,
“Style” : “Rock'n'Roll”,
“Members” :[“Mick”],”Keith”,”Charlie”,”Bill”]
}
]
在JSON的官網(wǎng)上描述JSON如下:
1. 一個輕量級的數(shù)據(jù)轉(zhuǎn)化形式。
2. 容易人們?nèi)プx和寫。
3. 容易機器去解析和生成。
JSON的語法:
JSON對于一些初級程序員可能覺得不好讀和寫,但是對于比較有經(jīng)驗的人來說還是相當(dāng)不錯的(個人觀點)。
雖然JSON和javascript的語法差不多但是它的每個對象不能夠賦值給一個變量。也就是它本身不是哥object而是個字符串。每次得到JSON時我們必須通過轉(zhuǎn)化來使用它。雖然使用javascript的eval()功能能夠?qū)崿F(xiàn)轉(zhuǎn)換,但是為了安全起見建議大家使用json.js來轉(zhuǎn)換??梢缘缴厦嫣峁┑哪莻€地址下載。它里面最基本的兩個方法:
JSON.parse(strJSON)-是用來轉(zhuǎn)化JSON字符串為JavaScript對象的、
JSON.stringify(objJSON) –用來轉(zhuǎn)化一個JavaScript對象為一個JSON對象的。
這個是客戶端的數(shù)據(jù)轉(zhuǎn)化,那么服務(wù)器端如何進(jìn)行呢?針對不同的語言會有不同的已經(jīng)非常好的轉(zhuǎn)換庫。因為本人是接近.net的所以這里介紹如何使用C#來進(jìn)行JSON的服務(wù)器端轉(zhuǎn)換。
我看一個外國大哥寫了一篇 關(guān)于在.net下如何轉(zhuǎn)化JSON的文章相當(dāng)不錯。他把JSON.NET和微軟的JavaScriptSerializer集成到一塊,這樣不管你是哪種格式的JSON基本上都能搞定了、
現(xiàn)提供個簡單的轉(zhuǎn)化JSON的生成和解析JSON的代碼:
復(fù)制代碼 代碼如下:
public string Serialize(object value)
{
Type type = value.GetType();
Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();
json.NullValueHandling = NullValueHandling.Ignore;
json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
if (type == typeof(DataRow))
json.Converters.Add(new DataRowConverter());
else if(type == typeof(DataTable))
json.Converters.Add(new DataTableConverter());
else if (type == typeof(DataSet))
json.Converters.Add(new DataSetConverter());
StringWriter sw = new StringWriter();
Newtonsoft.Json.JsonTextWriter writer = new JsonTextWriter(sw);
if (this.FormatJsonOutput)
writer.Formatting = Formatting.Indented;
else
writer.Formatting = Formatting.None;
writer.QuoteChar = '"';
json.Serialize(writer, value);
string output = sw.ToString();
writer.Close();
sw.Close();
return output;
}
public object Deserialize(string jsonText, Type valueType)
{
Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();
json.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
json.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
json.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
StringReader sr = new StringReader(jsonText);
Newtonsoft.Json.JsonTextReader reader = new JsonTextReader(sr);
object result = json.Deserialize(reader, valueType);
reader.Close();
return result;
}
在NET.JSON的基礎(chǔ)上使用JavascriptSeriazible來轉(zhuǎn)換:
復(fù)制代碼 代碼如下:
internal class WebExtensionsJavaScriptSerializer : JSONSerializerBase, IJSONSerializer
{
public WebExtensionsJavaScriptSerializer(JSONSerializer serializer) : base(serializer)
{}
public string Serialize(object value)
{
JavaScriptSerializer ser = new JavaScriptSerializer();
List<JavaScriptConverter> converters = new List<JavaScriptConverter>();
if (value != null)
{
Type type = value.GetType();
if (type == typeof(DataTable) || type == typeof(DataRow) || type == typeof(DataSet))
{
converters.Add(new WebExtensionsDataRowConverter());
converters.Add(new WebExtensionsDataTableConverter());
converters.Add(new WebExtensionsDataSetConverter());
}
if (converters.Count > 0)
ser.RegisterConverters(converters);
}
return = ser.Serialize(value);
}
public object Deserialize(string jsonText, Type valueType)
{
// *** Have to use Reflection with a 'dynamic' non constant type instance
JavaScriptSerializer ser = new JavaScriptSerializer();
object result = ser.GetType()
.GetMethod("Deserialize")
.MakeGenericMethod(valueType)
.Invoke(ser, new object[1] { jsonText });
return result;
}
}
internal class WebExtensionsDataTableConverter : JavaScriptConverter
{
public override IEnumerable<Type> SupportedTypes
{
get { return new Type[] {typeof (DataTable)}; }
}
public override object Deserialize(IDictionary<string, object> dictionary, Type type,
JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
下篇介紹如何在ASP.NET的環(huán)境下使用JSON和DataTable等的轉(zhuǎn)換,還有介紹使用JQuery的AJAX調(diào)用Web Services的生成JSON、相當(dāng)值得期待。^_^
您可能感興趣的文章:
- JQuery jsonp 使用示例代碼
- AJAX的跨域與JSONP(為文章自動添加短址的功能)
- asp.net+jquery Jsonp使用方法
- jquery下利用jsonp跨域訪問實現(xiàn)方法
- 跨域請求之jQuery的ajax jsonp的使用解惑
- JS對象與JSON格式數(shù)據(jù)相互轉(zhuǎn)換
- 說說JSON和JSONP 也許你會豁然開朗
- js/ajax跨越訪問-jsonp的原理和實例(javascript和jquery實現(xiàn)代碼)
- 借助script進(jìn)行Http跨域請求:JSONP實現(xiàn)原理及代碼
- js將json格式內(nèi)容轉(zhuǎn)換成對象的方法
- JS對象與json字符串格式轉(zhuǎn)換實例
- JSONP跨域GET請求解決Ajax跨域訪問問題
- SQL Server中將查詢結(jié)果轉(zhuǎn)換為Json格式腳本分享
- AJAX實現(xiàn)跨域的三種方法(代理,JSONP,XHR2)
- 淺析json與jsonp區(qū)別及通過ajax獲得json數(shù)據(jù)后格式的轉(zhuǎn)換
相關(guān)文章
JSON.parse 數(shù)據(jù)不完整的解決方法
本文主要介紹了JSON.parse 數(shù)據(jù)不完整的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07js+json用表格實現(xiàn)簡單網(wǎng)站左側(cè)導(dǎo)航
閑暇之余,制作一用表格實現(xiàn)的簡單的網(wǎng)站導(dǎo)航條,分享給大家。這里的數(shù)據(jù)基于json格式,學(xué)習(xí)json的朋友可以參考下。2010-04-04使用JSON作為函數(shù)的參數(shù)的優(yōu)缺點
這篇文章主要介紹了使用JSON作為函數(shù)的參數(shù)的優(yōu)缺點,需要的朋友可以參考下2016-10-10JSON 入門教程基礎(chǔ)篇 json入門學(xué)習(xí)筆記
剛開始接觸json的時候感覺有點奇怪的命名,后來使用才發(fā)現(xiàn)這么簡單而且用好用,擴展性很強,這里就為大家整理一下2020-09-09