zoukankan      html  css  js  c++  java
  • 在Silverlight中使用Json

          Silverlight提供了几个类来帮助我们方便地转换从WCF获取的JSON数据。它们是:
      
          DataContractJsonSerializer (位于 System.Runtime.Serialization.Json)
      
          JsonObject (位于System.Json,将JSON数据流转换成为可读写的对象)
      
          JsonArray (位于System.Json, 对JSON数据流转换成为JsonObject数组形式,可支持LINQ查询)
       
         注:如果要引用System.Runtime.Serialization.Json名空间里的Json,则必须也引用System.ServiceModel,
    否则Json会无法使用。
      
         这三类以都支持Stream类型参数,而该参数就是从WCF获取的JSON数据流。使用它们也很简单,首先我们需
    要建立一个AJAX型WCF,如下图:

     


        因为我们是获取用户数据,所以将这个WCF命名为UserService.cs
       
        然后对这个WCF做如下修改:
       
       
        1.对SVC头文件添加WebServiceHostFactory,如下:
      

     <%@ ServiceHost Language="C#" Debug="true" Service="UserService"
         Factory
    ="System.ServiceModel.Activation.WebServiceHostFactory" %>
       
        2.注释web.config中的enableWebScript节点,如下:
        

    <behavior name="UserServiceAspNetAjaxBehavior">
            
    <!--<enableWebScript />-->
    </behavior>
         
        当然这里所用的WCF为,主要是为了支持形如下面的请求链接方式:
       
        http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUser

        而下面就是WCF中的代码段:
       
    [DataContract]
    public class UserInfo
    {
        [DataMember]
        
    public string Name { getset; }
        [DataMember]
        
    public string Address { getset; }
        [DataMember]
        
    public int Age { getset; }
        [DataMember]
        
    public bool IsMember { getset; }
       
    }

    [ServiceContract(Namespace 
    = "")]
    [AspNetCompatibilityRequirements(RequirementsMode 
    = AspNetCompatibilityRequirementsMode.Allowed)]
    public class UserService
    {
        List
    <UserInfo> userList = new List<UserInfo>
            {
                
    new UserInfo {Name = "赵二", Address = "北京", Age = 2, IsMember = true},
                
    new UserInfo {Name = "张三", Address = "北京", Age = 3, IsMember = false},
                
    new UserInfo {Name = "李四", Address = "北京", Age = 4, IsMember = true},
                
    new UserInfo {Name = "王五", Address = "北京", Age = 5, IsMember = false},
            };

        [OperationContract]
        [WebGet(ResponseFormat 
    = WebMessageFormat.Json, UriTemplate = "GetUser")]
        
    public UserInfo GetUser()
        {
            
    return new UserInfo() { Name = "张三", Address = "北京", Age = 3, IsMember = true };
        }

        [OperationContract]
        [WebGet(ResponseFormat 
    = WebMessageFormat.Json, UriTemplate = "GetUserListByAge/{age}")]
        
    public UserInfo GetUserListByAge(string age)
        {
            
    return (from u in userList
                    
    where u.Age == int.Parse(age)
                    select 
    new UserInfo
                    {
                        Age 
    = u.Age,
                        Name 
    = u.Name,
                        IsMember 
    = u.IsMember,
                        Address 
    = u.Address
                    }).SingleOrDefault();
        }

        [OperationContract]
        [WebGet(ResponseFormat 
    = WebMessageFormat.Json, UriTemplate = "GetUserList")]
        
    public List<UserInfo> GetUserList()
        {
            
    return userList;
        }
    }


        上面代码中的方法:
        GetUser() //对应DataContractJsonSerializer的调用演示
        GetUserList(string age) //对应JsonObject的调用演示
        GetAllUser() //对应JsonArray的调用演示
       
        分别使用了WebGet属性(位于System.ServiceModel.Web),且ResponseFormat皆为WebMessageFormat.Json
    (当然也支持WebMessageFormat.Xml)。而UriTemplate属性为该服务所支持的浏览器链接地址。
       
        当对上面的WCF编译运行之后,我们在浏览器中输入下面地址:
       
        http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUser //参见UriTemplate设置
       
        则此时IE会弹出一个保存窗口,如下截图:

        
       
         而保存到本地的文件内容如下:
       

    {"Address":"北京","Age":12,"IsMember":true,"Name":"张三"}
      
        看来通过对上述链接的调用,WCF会直接将我们想要的用户信息转换成JSON格式。
       
        注:另个两个链接及其返回JSON内容分别如下所示
        http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUserListByAge/2
       

    {"Address":"北京","Age":2,"IsMember":true,"Name":"赵二"}
       
        http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUserList
       

    [{"Address":"北京","Age":2,"IsMember":false,"Name":"赵二"},
         {
    "Address":"北京","Age":3,"IsMember":false,"Name":"张三"},
         {
    "Address":"北京","Age":4,"IsMember":false,"Name":"李四"},
         {
    "Address":"北京","Age":5,"IsMember":false,"Name":"王五"}]//自动转成JSON数组
        
         下面我们就来看一下Silverlight是何使用来解析上面传回来的JSON数据的.
        
         首先看一下使用DataContractJsonSerializer的示例(详见注释):
        
    private void GetUserToDataContract_Click(object sender, RoutedEventArgs e)
    {
        Uri serviceUri 
    = new Uri("http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUser");
        WebClient webClient 
    = new WebClient();
        webClient.OpenReadCompleted 
    += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
        webClient.OpenReadAsync(serviceUri);
    }    
       
    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        
    //声明一个UserInfo类型的DataContractJsonSerializer实例
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(UserInfo));
        
    //获取JSON数据流的信息,并将它转换成为UserInfo实例
        UserInfo userInfo = (UserInfo)serializer.ReadObject(e.Result);//e.Result为JSON流数据
       
        
    //下面显示userInfo中的数据信息
        UserList.Items.Add(string.Format("Name:{0}, Address:{1}, Age:{2}, IsMember:{3} ",
            userInfo.Name,
            userInfo.Address,
            userInfo.Age,
            userInfo.IsMember));
    }

       
       因为DataContractJsonSerializer支持将JSON转换成本地的对象类型,所以我们可以像使用普通对象实例
    一样。其运行结果如下图所示:

       
       
        
         看明白了这段代码之后,再看另两个JSON类的使用方法就简单多了。其DEMO代码如下:

    private void GetUserToJsonObject_Click(object sender, RoutedEventArgs e)
    {
        Uri serviceUri 
    = new Uri("
                http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUserListByAge/2");
        WebClient webClient_JsonObject = new WebClient();
        webClient_JsonObject.OpenReadCompleted 
    += 
                
    new OpenReadCompletedEventHandler(webClient_JsonObject_OpenReadCompleted);
        webClient_JsonObject.OpenReadAsync(serviceUri);
    }

    void webClient_JsonObject_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        JsonObject jsonObject 
    = (JsonObject) JsonObject.Load(e.Result);//e.Result为JSON流数据
        
    //下面获取JSON对象实例中的数据
        UserList.Items.Add(string.Format("Name:{0}, Address:{1}, Age:{2}, IsMember:{3} ",
            jsonObject[
    "Name"],
            jsonObject[
    "Address"],
            jsonObject[
    "Age"],
            jsonObject[
    "IsMember"])); 
    }
       
       其运行结果如下所示:

          
       

         最后再看一下JsonArray, 这个类可以看成是JsonObject的一个集合,它支持LINQ查询,其DEMO代码如下:

    private void GetUserToJsonArray_Click(object sender, RoutedEventArgs e)
    {
        Uri serviceUri 
    = new Uri("http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUserList");
        WebClient webClient_JsonArray 
    = new WebClient();
        webClient_JsonArray.OpenReadCompleted 
    += 
                 
    new OpenReadCompletedEventHandler(webClient_JsonArray_OpenReadCompleted);
        webClient_JsonArray.OpenReadAsync(serviceUri);
    }
            
    void webClient_JsonArray_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        JsonArray users 
    = (JsonArray)JsonArray.Load(e.Result);//e.Result为JSON流数据
        var userlist = from user in users
                       
    where user["Age"> 2
                       select user;
        
        
    foreach (JsonObject jsonObject in userlist)
        {
            UserList.Items.Add(
    string.Format("Name:{0}, Address:{1}, Age:{2}, IsMember:{3} ",
            jsonObject[
    "Name"],
            jsonObject[
    "Address"],
            jsonObject[
    "Age"],
            jsonObject[
    "IsMember"])); 
        }
    }

        运行结果如下图所示:

         

         当然在JSON名空间下还有许多不错的类,如果大家有兴趣,我会在以后进行介绍:) 

         好了,今天的内容就先到这里了。
       
         源码下载链接,请点击这里:)
  • 相关阅读:
    centos7 安装中文编码
    docker一些命令
    bash: ifconfig: command not found
    sublime3的licence(update 2016-04-14)
    Mac下更改python版本为3.5
    BigDecimal的equals
    cvc-elt.1: 找不到元素 'beans' 的声明
    Configuration problem: Only one AsyncAnnotationBeanPostProcessor may exist within the context.
    You need tcl 8.5 or newer in order to run the Redis test
    自定义的类型转换器中怎样自定义错误消息?(待解答)
  • 原文地址:https://www.cnblogs.com/daizhj/p/1227889.html
Copyright © 2011-2022 走看看