JSON in Code

有关于定义,描述之类的文字官方都有解释:http://json.org/json-zh.html

这次主题主要关于JSON的实际应用

 目录

  • JSON in Javascript
  • JSON in Asp.Net
  • LINQ to JSON
  • JSON Serialization
  • XML to JSON
  • Other Resources

  

1.JSON in Javascript

单列表

<script>
var User = {"UserID":01, "Name":"Rico", "Email":"rico◎hotmail.com"};
alert(User.Name);
</script>

实际应用时,还可以把Name分为FirstName,LastName

{"UserID":01, "Name":{"FirstName":"Rico","LastName":"Rui"}, "Email":"rico◎hotmail.com"}

集合

<script>

var UserList = [
{"UserID":01, "Name":{"FirstName":"Rico","LastName":"Rui"}, "Email":"rico◎hotmail.com"},
{"UserID":02, "Name":{"FirstName":"XXX","LastName":"YYY"}, "Email":"xxx◎hotmail.com"},
{"UserID":03, "Name":{"FirstName":"ZZZ","LastName":"AAA"}, "Email":"YYY◎hotmail.com"}
];

alert(UserList[0].Name.FirstName);

</script>

 

2.JSON in Asp.Net

Home.aspx:

<script language="javascript" type="text/javascript">
$(function() {
$.getJSON("../WebForm1.aspx",
{ t: "json" },
function(o) {
alert(o.Name + "->" + o.Rating);
}
);
         //以上写法也可以写成
         ///$.get("../WebForm1.aspx", {t:"json"}, function(o) { alert(o.Name + "->" + o.Rating); }, "json");  
       });
</script>

WebForm1.aspx.cs: (这里使用New Page方式,我们也可以使用httphandler方式(webForm1.ashx"))
using System.Web.Script.Serialization;
public partial class WebForm1 :System.Web.UI.Page {
protected void Page_Load ( object sender , EventArgs e ) {
            JavaScriptSerializer jss = new JavaScriptSerializer ();
JSONClass jsonClass = new JSONClass ();
jsonClass.Name = "JSON";
jsonClass.Value = 1;
Response.ContentType = "text/plain";
Response.Write ( jss.Serialize ( jsonClass ) );
            //必须收尾
            Response.End ();
}

public class JSONClass {
public string Name;
public int Value;
}
}

3.LINQ to JSON (support in his Json.NET library) 
创建数据
    private class DataEntity
{
public string Title { get; set; }
public string Description { get; set; }
public IList<string> Categories { get; set; }
}

private List<DataEntity> SetDatas()
{
return new List<DataEntity>()
{
new DataEntity()
{
Title = "Title One",
Description = "Description One",
Categories = new List<string>() { "Json.NET", "LINQ" }
},
new DataEntity()
{
Title = "Title Two",
Description = "Description Two",
Categories = new List<string>() { "Json.NET", "CodePlex" }
}
};
}
 public JObject SetDataToJObject(){

List<DataEntity> datas = SetDatas();

JObject rss =
new JObject (new JProperty ( "channel" ,
new JObject (new JProperty ( "title" , "Test Title" ) ,
new JProperty ( "description" , "Set Data Using JObject" ) ,
new JProperty ( "item" ,
new JArray (
from p in datas
orderby p.Title
select new JObject ( new JProperty ( "title" , p.Title ) ,
new JProperty ( "description" , p.Description ) ,
new JProperty ( "category" ,new JArray (
from c in p.Categories
select new JValue ( c ) )
              )))))));

return rss.ToString ();
}
输出的结果
            //{
// "channel": {
// "title": "Test Title",
// "description": "Set Data Using JObject",
// "item": [
// {
// "title": "Title Two",
// "description": "Description Two",
// "category": [
// "Json.NET",
// "CodePlex"
// ]
// },
// {
// "title": "Title One",
// "description": "Description One",
// "category": [
// "Json.NET",
// "LINQ"
// ]
// }
// ]
// }
//}
查询数据
 public void SearchDataList() {
           var  dataList = SetDataToJObject();
            var titles =
from p in dataList["channel"]["item"]
select p.Value<string> ( "title" );


foreach ( var item in titles ) {
Console.WriteLine ( item );
}

查询结果
 //Title One
//Title Two

var categories =
from c in dataList["channel"]["item"].Children()["category"].Values<string> ()
group c by c into g
orderby g.Count () descending
select new { Category = g.Key , Count = g.Count () };


foreach ( var c in categories ) {
Console.WriteLine ( c.Category + " - Count: " + c.Count );
}
            查询结果 
//Json.NET - Count: 2
//LINQ - Count: 1
//CodePlex - Count: 1
}
*linq to Json 实际上就是linq to object
 
4.JSON Serialization 

有关于序列化:

.NET Framewok 3.5也提供了JSON对象序列化和反序列化的类,System.Runtime.Serialization.Json 命名空间下的 DataContractJsonSerializer 类。

当然也可以使用JSon.Net中的Serializer

以下代码 使用DataContractJsonSerializer 类

定义实体

    [DataContract]
public class DataEntity
{
[DataMember]
public String name { get; set; }
[DataMember]
public Int32 value { get; set; }
}

*Json 是在 Windows Communication Foundation (WCF) 中创建的 ASP.NET AJAX 服务所使用的默认数据格式。

所以定义实体会声明相关DataContract,DataMember的属性,

通过将 DataContract 附加到类并将 DataMember 属性附加到要序列化的成员,为DataEntity定义数据协定。

 

(反)序列化代码

         /// <summary>
/// JSON序列化
/// </summary>
public string JSONSerializer(object item)
{

DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType());

using (MemoryStream memoryStream = new MemoryStream())
{

serializer.WriteObject(memoryStream, item);

StringBuilder sb = new StringBuilder();

sb.Append(Encoding.UTF8.GetString(memoryStream.ToArray()));

return sb.ToString();

}

}
        /// <summary>
/// JSON 反序列化为对象
/// </summary>
public T JSONDeSerializer<T>(string jsonStr)
{

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));

MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonStr));

T jsonObj = serializer.ReadObject(memoryStream) as T;

memoryStream.Close();

return jsonObj;

}

序列化工作结束。以下演示如何

使用(反)序列化的数据或对象

获取数据 CODE—> Page

Page:

<script language="javascript" type="text/javascript">

           $(function() {
$.ajax({
url: "WebForm2.ashx",
type: 'GET',
data: {},
dataType: 'json',
timeout: 1000,
error: function(XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },
success: function(result) {

alert(result.name + "->" + result.value);
}
});
});
</script> 
CodeFile:
   public class WebForm2: IHttpHandler
{
public void ProcessRequest(HttpContext context) {
DataEntity data = new DataEntity();

data.name = "Name";
data.value = 01;

context.Response.Write(data.JSONSerializer());
}
        public bool IsReusable {
get
{
return false;
}
}
}

返回结果

{"name":"Name","value":01}

 

设置数据 Page—>Code

Page:

<script src="json2.js" type="text/javascript"></script>

 

<script language="javascript" type="text/javascript">

          $(function() {

var jsData = { name: "Name", value: 01 };

//应用Json2.js中的stringify方法生成JSon String
var jsonStr = JSON.stringify(jsData);

$.ajax({
url: "WebForm3.ashx",
type: 'POST',
data: { postjson: jsonStr },
dataType: 'json',
timeout: 1000,
error: function(XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },
success: function(result) {

alert(result.success);
}

});
});
</script> 
CodeFile:
 public class webForm3: IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string jsonStr = context.Request["postjson"];

DataEntity dataEntity = jsonStr.JSONDeSerializer<DataEntity>();

if (string.IsNullOrEmpty(dataEntity.name))
            {
context.Response.Write("{success:false}");
}
else
{
context.Response.Write("{success:true}");
}
        }
public bool IsReusable {
get
{
return false;
}
}
}
 
5.XML to JSON 

参考:xml2json

JSON in Code_第1张图片

 

6.其他资源:

 

1.Enum
首先所有 enum 成员都是可序列化的,然后序列化Enum值时,一般只会生成数字 
如:public enum Color {red, green, blue, yellow, pink}则序列化 yellow 将生成数字 3,而不是字符串“yellow”。
 
2.Time、Date
JSON 格式不直接支持日期和时间,为了解决问题微软也有处理方案,如下
 
资源参考:
微软ASP.NET AJAX中日期类型的JSON处理
Json 的日期格式与.Net DateTime类型的转换

json2.js 不能反序列化时间属性问题

 

代码:

Code File:

public class Data {

public string Name;

public DateTime time;

}

public String getData() {

Data pd = new Data ("Rico", DateTime.Now());

return "(" + JavascriptSerializer.Serializer(pd) + ")";

}
Page:
<script language="javascript" type="text/javascript"> 
var pagedata = eval('<%= getData() %>');
</script> 

3.JsonCache

Json客户端Cache提高Web性能

你可能感兴趣的:(json)