WP7 Json 解析那些事儿(下)
好吧,距离上篇时间时间很长了,因为本人平时工作很忙,又懒,更新的频率比较低
这次接着上篇的说,上篇说过,用Ms自带的序列化反序列化的方法来解析Json有缺陷,这也是我在项目实践中遇到过的,之前一直没弄明白用什么办法,入下面的Json串:
public string sJson = @"{'infocode':'000000','result':{'cb':'state##0','cate':'29','isonline':'0','mobilelocation':'广州',
'c':'转靓仔五菱之光,车况一流,绝无事故,机头静,空调冻,真皮座椅,铝铃,刚买保险年审,手续齐全包过户或迁出,白云区太和镇派出所往华南快线方向走800米即到.',
'a':'113.2644230#23.1290750','z2':['预售价格','1.8万元'],'z3':'区域##广州','m':'3133383234343635363833','im':'823478','url':'http.shtml','v':'4490','
'isbiz':'','t':'(出售)转豪华版7座1.1L 五菱之光','r':'陆生','p':['http17240742790669.jpg','http://p1/tiny/n_17240752458508.jpg','http://748428.jpg','http://p1/tiny/n_17240767232010.jpg'],
'ci':'','z':'2012-03-09 10:17','sinacode':'123987651045','catename':'二手车',
'x':['品牌车系##五菱五菱之光','车辆类型##面包车','基本参数##多彩色','上牌时间##2005年','行驶里程##8万公里'],'waring':'①要求预付定金、加Q详聊网站!'}}'";
用jsonviewer来查看出来的结构大体如下
-
result:
-
cb: "state##0",
-
cate: "29",
-
isonline: "0",
-
mobilelocation: "广州",
-
c: "转靓仔五菱之光,车况一流,绝无事故,机头静,空调冻,真皮座椅,铝铃,刚买保险年审,手续齐全包过户或迁出,白云区太和镇派出所往华南快线方向走800米即到.",
-
a: "113.2644230#23.1290750",
-
z2:
-
"预售价格",
-
"1.8万元"
-
-
z3: "区域##广州",
-
m: "3133383234343635363833",
-
v: "4490",
-
isbiz: "",
-
t: "(出售)转豪华版7座1.1L 五菱之光",
-
r: "陆生",
-
ci: "",
-
z: "2012-03-09 10:17",
-
catename: "二手车",
-
x:[
-
"品牌车系##五菱五菱之光",
-
"车辆类型##面包车",
-
"基本参数##多彩色",
-
"上牌时间##2005年",
-
"行驶里程##8万公里"
-
-
waring: "①要求预付定金、加Q详聊、邮寄交易等均存在欺骗行为!##②价格低廉、内容里留有电话的要谨慎!##③谨防以任何形式冒用58网址的钓鱼网站!"
-
}上面涉及隐私的我删掉了,重要的是看这个Json和之前的有什么不同,其实最大的地方在于有个数组,比如说z2作为key,它的子项是一个数组
这个数组有value没key。而我查阅了一下,这样也确实合乎Json协议的规范,这样的jSON,使用我们上一篇所用的方法,貌似就不行了(当然不敢说百分百,如果
哪位哥们用微软自带的序列类,可以解析这样的Json串,还请告知,给本人扫扫盲,呵呵)
我采用的解决方法是利用到了一个第三方库,Newtonsoft.Json.WindowsPhone.dll,具体下载和引用,就不多说了,网上很多。
这个库很强大,我们一般仅用一小部分就可以解决我们遇到的问题,有几个关键的类需要好好学习:JObject JArray JProperty JValue
最强大的一个类:JObject,所有的string json串都可以通过一个静态方法转化成json对象,然后进行Linq to Json操作
JObject o = JObject.Parse(json);
其中所有的类都派生于JToken,也就是说所有的LINQ to JSON对象都可以用JToken来表示,即JObject、JProperty还是JArray JValue都可以利用李氏替换原则而用JToken来表示。认清这一点是非常必要的,因为接下来的示例中将多次用到他们之间的类型转换。
那么之前的Json我用以下的解析函数来解析
private TJsonData ParsePostDetail(string sJson)
{
JObject jObj = JObject.Parse(sJson);
string infoCode = (string)jObj["infocode"];
TJsonData jsonData = new TJsonData();
jsonData.AddInfoCode(infoCode);
if (infoCode == "000000")
{
var result = jObj["result"];
foreach (var item in result)
{
if (item is JProperty)
{
JProperty itemTmp = item as JProperty;
if (itemTmp.Value is JValue)
{
JValue jv = (JValue)itemTmp.Value;
string js = (string)jv.Value;
jsonData.AddResultProperty(itemTmp.Name, js);
}
else if (itemTmp.Value is JArray)
{
JArray ja = (JArray)itemTmp.Value;
string[] jaContent = new string[ja.Count];
int index = 0;
foreach (JValue it in ja)
{
jaContent[index] = (string)it.Value;
index++;
}
jsonData.AddResultArray(itemTmp.Name, ja.Count, jaContent);
}
}
}
}
return jsonData;
}