在不使用其他库的情况下,WP-RT应用中也可以处理JSON数据。主要的几个类都放到Windows.Data.Json命名空间中:
IJsonValue接口作为用于封装JSON数据的规范,其中只读属性ValueType通过JsonValueType枚举来标识JSON值的类型,如String表示JSON的值是字符串,Number表示数值等。
实现IJsonValue接口的类都用于处理JSON数据,比如JsonObject表示单个JSON对象,JsonArray表示数组等。
可能大家觉得我前面说的都是废话,确实挺废的,其实这些类型用起来也不那么复杂,大家只要多写写多耍耍就可以掌握了。
所以,我们用一堆例子来试玩一下。
1、创建JSON数组,并向其中添加元素。
// JSON数组 JsonArray arr = new JsonArray(); // 向数组中添加元素 arr.Add(JsonValue.CreateNumberValue(100d)); arr.Add(JsonValue.CreateNumberValue(200d)); arr.Add(JsonValue.CreateStringValue("hot dog")); // 将JSON数组表示为字符串 string jsonstr = arr.Stringify(); Debug.WriteLine(jsonstr);
Stringify方法可以提取JSON对象的字符串表示形式。得到结果如下:
[100,200,"hot dog"]
2、也可以用JsonObject类来创建JSON对象。
JsonObject obj = new JsonObject(); // 设置各字段的名字和值 obj.SetNamedValue("工号", JsonValue.CreateStringValue("000-410002")); obj.SetNamedValue("姓名", JsonValue.CreateStringValue("王小狗")); obj.SetNamedValue("年龄", JsonValue.CreateNumberValue(45)); obj.SetNamedValue("婚否", JsonValue.CreateBooleanValue(true)); // 提取字符串 string jsstr = obj.Stringify(); Debug.WriteLine(jsstr);
各位知道,JSON对象是用一对大括号来包装的,每个字段用逗号隔开,而字段名和值之间由冒号隔开,即字段包括名字和具体的值,故SetNamedValue方法定义如下:
void SetNamedValue(string name, IJsonValue value);
name表示JSON对象的字段名,而value是值,因为JSON的值也可以是复杂的类型,因为value参数定义为IJsonValue类型,即凡实现IJsonValue按口的类型都OK。
上面例子得到的结果如下:
{"工号":"000-410002","姓名":"王小狗","年龄":45,"婚否":true}
3、从字符串生成JSON数据。
可以分析表示JSON的字符串,然后生成相关类型。
string tststr = "{"ID":"40033201", "Name":"小明", "City":"天津"}"; JsonObject obj = JsonObject.Parse(tststr); // 获取各字段的值 string id = obj.GetNamedString("ID"); string name = obj.GetNamedString("Name"); string city = obj.GetNamedString("City"); string display = string.Format("学号:{0} 姓名:{1} 城市:{2}", id, name, city); Debug.WriteLine(display);
Parse是静态方法,传入表示JSON数据的字符串,就可以产生对应的实例对象。要从JSON数据中读取指定字段的值,可以调用GetNamedXXX,如上面示例中要获取的值是字符串类型的,因而调用GetNamedString方法。
上面的执行结果如下:
学号:40033201
姓名:小明
城市:天津
好了,以上几个例子比较TMD简单,我350%相信大家能看懂,下面咱们来个BT一点的,看看嵌套的JSON对象。
JsonObject 中奖人 = new JsonObject(); // 子对象 JsonObject 地址 = new JsonObject(); 地址.SetNamedValue("省", JsonValue.CreateStringValue("广东")); 地址.SetNamedValue("市", JsonValue.CreateStringValue("汕头")); 地址.SetNamedValue("详细地址", JsonValue.CreateStringValue("不告诉你")); // 子对象 JsonArray 中奖号码 = new JsonArray(); 中奖号码.Add(JsonValue.CreateNumberValue(5d)); 中奖号码.Add(JsonValue.CreateNumberValue(27d)); 中奖号码.Add(JsonValue.CreateNumberValue(2d)); 中奖号码.Add(JsonValue.CreateNumberValue(32d)); // 设置字段 中奖人.SetNamedValue("姓名", JsonValue.CreateStringValue("超级赌圣")); 中奖人.SetNamedValue("住址", 地址); 中奖人.SetNamedValue("个人简介", JsonValue.CreateStringValue("赌遍太阳系无敌手")); 中奖人.SetNamedValue("中奖号码", 中奖号码); string str = 中奖人.Stringify(); Debug.WriteLine(str);
得到结果如下:
{"姓名":"超级赌圣","住址":{"省":"广东","市":"汕头","详细地址":"不告诉你"},"个人简介":"赌遍太阳系无敌手","中奖号码":[5,27,2,32]}
最后感谢大家观看本期的老周吹牛节目。