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

image

 

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性能

posted @ 2009-10-10 16:36  RicoRui  阅读(3683)  评论(4编辑  收藏  举报