微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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]
    
string  Name {  get set ; }
    [DataMember]
    
 Address {  int  Age {  bool  IsMember {  ; }
   
}

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

    [OperationContract]
    [WebGet(ResponseFormat 
GetUserListByAge/{age}  UserInfo GetUserListByAge(  age)
    {
        
 (from u  in  userList
                
where  u.Age  == .Parse(age)
                select 
 UserInfo
                {
                    Age 
 u.Age,
                    Name 
 u.Name,
                    IsMember 
 u.IsMember,
                    Address 
 u.Address
                }).SingleOrDefault();
    }

    [OperationContract]
    [WebGet(ResponseFormat 
GetUserList  GetUserList()
    {
        
 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 Name 张三 }
  
    看来通过对上述链接调用,WCF会直接将我们想要的用户信息转换成JSON格式。
   
    注:另个两个链接及其返回JSON内容分别如下所示
    http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUserListByAge/2
   

2 赵二 }
   
    http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUserList
   

[{ 3 4 李四 5 王五 }] // 自动转成JSON数组
    
     下面我们就来看一下Silverlight是何使用来解析上面传回来的JSON数据的.
    
     首先看一下使用DataContractJsonSerializer的示例(详见注释):
    
private void  GetUserToDataContract_Click( object  sender, RoutedEventArgs e)
{
    Uri serviceUri 
 Uri( http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUser );
    WebClient webClient 
 WebClient();
    webClient.OpenReadCompleted 
+=  OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
    webClient.OpenReadAsync(serviceUri);
}    
   
 webClient_OpenReadCompleted( 声明一个UserInfo类型的DataContractJsonSerializer实例     DataContractJsonSerializer serializer   DataContractJsonSerializer( typeof (UserInfo));
    
获取JSON数据流的信息,并将它转换成为UserInfo实例     UserInfo userInfo   (UserInfo)serializer.Readobject(e.Result); e.Result为JSON流数据
   
    
下面显示userInfo中的数据信息     UserList.Items.Add( .Format( Name:{0}, Address:{1}, Age:{2}, IsMember:{3}     
   因为DataContractJsonSerializer支持将JSON转换成本地的对象类型,所以我们可以像使用普通对象实例
一样。其运行结果如下图所示:

   


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

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

 webClient_JsonObject_OpenReadCompleted(  (JsonObject) JsonObject.Load(e.Result); e.Result为JSON流数据
    
下面获取JSON对象实例中的数据     UserList.Items.Add( string .Format( " " Name ],0)">Address Age IsMember ])); 
}
   
   其运行结果如下所示:

      


   

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

 GetUserToJsonArray_Click( http://localhost:1514/Json_SilverlightWeb/UserService.svc/GetUserList );
    WebClient webClient_JsonArray 
 WebClient();
    webClient_JsonArray.OpenReadCompleted 
 
             
 OpenReadCompletedEventHandler(webClient_JsonArray_OpenReadCompleted);
    webClient_JsonArray.OpenReadAsync(serviceUri);
}
        
 webClient_JsonArray_OpenReadCompleted(  (JsonArray)JsonArray.Load(e.Result); e.Result为JSON流数据     var userlist   from user  in  users
                   
where  user[ >   2
                   select user;
    
    
foreach  (JsonObject jsonObject   userlist)
    {
        UserList.Items.Add(
])); 
    }
}

    运行结果如下图所示:

     



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

     好了,今天的内容就先到这里了。
   
     源码下载链接,请点击这里:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐