在Silverlight中使用Json

在Silverlight中使用Json,第1张

概述      Silverlight提供了几个类来帮助我们方便地转换从WCF获取的JSON数据。它们是:          DataContractJsonSerializer (位于 System.Runtime.Serialization.Json)          JsonObject (位于System.Json,将JSON数据流转换成为可读写的对象)          JsonArray       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会d出一个保存窗口,如下截图:

    


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

{ 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名空间下还有许多不错的类,如果大家有兴趣,我会在以后进行介绍:) 

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

以上是内存溢出为你收集整理的在Silverlight中使用Json全部内容,希望文章能够帮你解决在Silverlight中使用Json所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1055141.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存