假定按照 如何:对基于 HTTP 的服务发出请求中描述的方法向基于 HTTP 的 Web 服务发出请求后,在 Stream 类型的 responseStream 对象中返回了下列 JSON。
{"IsMember" : true, "Name" : "John", "Age" : 24}
使用 DataContractJsonSerializer
定义 User 类型来反序列化 JSON。
{
public bool IsMember { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
不 需要将某个类型或该类型的具有特殊属性的成员标记为选择反序列化,因为所有 public 成员都自动包括在数据协定中。这是数据协定编程模型的简化版本,该模型要求为要包括在数据协定中的每个成员附加 DataMemberAttribute 属性,并为每个类型附加 DataContractAttribute 属性。当前编程模型启用成员的名称和可见性来决定它是否序列化。有关更多信息,请参见 “Silverlight 序列化”。
下列代码显示如何创建 DataContractJsonSerializer 的实例,并使用它将 responseStream 反序列化为 User 对象。
new DataContractJsonSerializer(typeof(User));
User user = (User)serializer.ReadObject(responseStream);
bool isMember = user.IsMember;
string name = user.Name;
int age = user.Age;
使用 JsonObject 和 LINQ
Silverlight 提供了 JsonPrimitive、 JsonArray 和 JsonObject 类型,这些类型允许您以弱类型方式处理 JSON。此方法允许您动态地访问基元 JSON 类型(string、number、Boolean)的值,并索引为结构化 JSON 类型(object 和 array),而不需要预定义反序列化的目标类型(例如 User 类型)。下列代码演示如何执行此操作。
bool isMember = user["IsMember"];
string name = user["Name"];
int age = user["Age"];
使用 JsonObject 和 LINQ 可以方便地处理复杂的 JSON 对象。例如,假定在 Stream 类型的 responseStream 对象中包含下列 JSON。
{"IsMember" : false, "Name" : "Paul", "Age" : 44},
{"IsMember" : true, "Name" : "George", "Age" : 12}]
若要检索作为成员的所有人员,请对 JsonArray 对象使用以下 LINQ 查询。
var members = from member in users
where member["IsMember"]
select member;
foreach (JsonObject member in members)
{
string name = member["Name"];
int age = member["Age"];
}
(*)友情提示:Silverlight要是使用以上的类需要手动添加相关引用.
DataContractJsonSerializer (位于 System.Runtime.Serialization.Json)引用System.ServiceMode.Web
JsonObject (位于System.Json,将JSON数据流转换成为可读写的对象)
JsonArray (位于System.Json, 对JSON数据流转换成为JsonObject数组形式,可支持LINQ查询)
如果要引用System.Runtime.Serialization.Json名空间里的Json, 则必须也引用System.ServiceModel, 否则Json会无法使用。