Metro应用Json数据处理

时间:2023-03-09 09:48:03
Metro应用Json数据处理

  Windows Phone 8 或者 Windows 8 平台对JSON数据的处理方式基本是一致的,需要使用DataContractJsonSerializer类将对象的实例序列化为JSON字符串,并将字符串反序列化为对象的实例,需要注意的此种处理方式要求Json数据的格式固定的。

  

  Json字符串 => 对象

  针对以下Json字符串进行数据对象的构造解析

{
"name": "ZhangHui",
"sex": "男",
"cnblogs": {
"address": "http://www.cnblogs.com/huizhang212/",
"age": 2,
"nickname": "宇之乐"
},
"contacts": [
{
"type": "QQ",
"number": "411300114"
},
{
"type": "Email",
"number": "huizhang212@163.com"
}
]
}

  1.构造对象

  分析上面json数据的格式,可以发现其中包含子对象cnblogs和子对象数组contacts,所以需要构造两个子对象Cnblogs和Contact,对象代码如下:

     /// <summary>
/// 人员博客园论坛信息
/// </summary>
[DataContract]
public class Cnblogs
{
[DataMember]
public String nickname { get; set; }
[DataMember]
public int age { get; set; }
[DataMember]
public String address { get; set; }
} /// <summary>
/// 人员电话号码信息对象
/// </summary>
[DataContract]
public class Contact
{
[DataMember]
public String type { get; set; }
[DataMember]
public String number { get; set; }
}

  子对象构建完成后,构建json数据对应的对象,记为:Person,代码如下:

     /// <summary>
/// 人员信息对象
/// </summary>
[DataContract]
public class Person
{
[DataMember]
public String name { get; set; }
[DataMember]
public String sex { get; set; }
[DataMember]
public Cnblogs cnblogs { get; set; }
[DataMember]
public List<Contact> contacts { get; set; }
}

  构造对象必须有[DataContract]声明,在通过DataContractJsonSerializer进行序列号或者反序列号的过程中只对有[DataMember]声明的属性生效,没有[DataMember]声明的属性将会被忽略,对象属性的大小写需要和json数据对应字段保持一致,否则该属性的值无法获取。

  2.Json字符串转换Person对象的转换函数实现

         /// <summary>
/// 解析json数据转化为Person对象
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public Person getPersionByJson(String json)
{
if (String.IsNullOrEmpty(json))
{
return null;
} try
{
Person info = new Person();
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
DataContractJsonSerializer ser = new DataContractJsonSerializer(info.GetType());
info = ser.ReadObject(ms) as Person;
return info;
}
catch
{ }
return null;
}

  3.调用getPersionByJson方法将Json字符串转换为对象

     //Json数据
String json =
@"{
""name"": ""ZhangHui"",
""sex"": ""男"",
""cnblogs"": {
""address"": ""http://www.cnblogs.com/huizhang212/"",
""age"": 2,
""nickname"": ""宇之乐""
},
""contacts"": [
{
""type"": ""QQ"",
""number"": ""411300114""
},
{
""type"": ""Email"",
""number"": ""huizhang212@163.com""
}
]
}";
//json数据转换为Person对象
Person person = getPersionByJson(json);

  对象 => Json字符串

  通过DataContractJsonSerializer可以直接将对象转换为Json字符串。

  1.Person对象转换Json字符串的函数实现

         /// <summary>
/// 获Person对象的Json数据
/// </summary>
/// <param name="normal"></param>
/// <returns></returns>
public String getJsonByPerson(Person person)
{
String json = String.Empty;
try
{
MemoryStream ms = new MemoryStream();
DataContractJsonSerializer ser = new DataContractJsonSerializer(person.GetType());
ser.WriteObject(ms, person);
ms.Position = ;
using (StreamReader s = new StreamReader(ms))
{
json = s.ReadToEnd();
}
}
catch
{ }
return json;
}

  2.调用getJsonByPerson方法将Person对象转换为Json字符串

     //构建一个Persion对象
Person person = new Person()
{
name = "ZhangHui",
sex = "男",
cnblogs = new Cnblogs()
{
nickname = "宇之乐",
age = ,
address = "http://www.cnblogs.com/huizhang212/"
},
contacts = new List<Contact>()
{
new Contact(){ type="QQ", number="" },
new Contact(){ type="Email", number="huizhang212@163.com" }
}
};
//转换为json数据
String personJson = getJsonByPerson(person);