LitJson如何解析Json?

LitJson解析Json,使用了LitJson这个开源组件,如果在C#脚本下使用该组件处理json很容易,在JavaScript脚本中处理其实 也不难。首先要在Project里Import New Asset把LigJson.dll文件导入,然后在JavaScript脚本中就可以直接使用了。

 

  
  
  
  
  1. function Start() { 
  2.  
  3. var s : String = “{'name':'aaa'}”; 
  4.  
  5. var json : LitJson.JsonData = LitJson.JsonMapper.ToObject(s); 
  6.  
  7. print(json[“name”]); 
  8.  
  9.  
  10. function Update () { 
  11.  

 

JsonData实现的接口如下:

 

  
  
  
  
  1. IJsonWrapper, IList, ICollection, IEnumerable, IOrderedDictionary, IDictionary, IEquatable<JsonData> 

JsonData需要从Json字符串返回的类型来判断该JsonData类型是否为数组,这一点可以从它的IsArray方法可以看出。

 

  
  
  
  
  1. eg: 
  2.  
  3. string s = “[{'name':'lisi'},{'name':'zhangsan'}]”; 
  4.  
  5. string a = “{'name':'aaa'}”; 
  6.  
  7. JsonData[] jarr = JsonMapper.ToObject<JsonData[]>(s); 
  8.  
  9. print(jarr. IsArray);//返回true 
  10.  
  11. if(jarr.IsArray){ 
  12.  
  13. foreach(JsonData jd in jarr){ 
  14.  
  15. print(jd[“name”]);//返回结果: lisi 
  16.  
  17. // zhangsan 
  18.  
  19.  
  20.  
  21. JsonData jdata = JsonMapper.ToObject(s); 
  22.  
  23. print(jdata.IsArray);//返回true 
  24.  
  25. if (jdata.IsArray) 
  26.  
  27.  
  28. for (int i = 0; i < jdata.Count;i ++ ) 
  29.  
  30.  
  31. print(jdata[i][“name”]);//返回的结果: lisi 
  32.  
  33. // zhangsan 
  34.  
  35.  
  36.  
  37. JsonData j = JsonMapper.ToObject(a); 
  38.  
  39. print(j.IsArray);//返回false 
  40.  
  41. print(j[“name”]);//返回aaa 

从上面的示例可以看出JsonData是否能以数组的方式访问需看json字符串返回的是否是数组类型的,示例展示了最基本的JsonData用法: 创建一个JsonData通常由JsonMapper的ToObject方法,这个方法有3个重载:

 

  
  
  
  
  1. JsonMapper.ToObject(JsonReader reader); 
  2.  
  3. JsonMapper.ToObject(string json); 
  4.  
  5. JsonMapper.ToObject(System.IO.TextReader reader); 

其中JsonReader类也是一个读取json字串的类,不过它是按行的方式读取,不能像key-value的方式读取json的值,第二个是最 常见的创建JsonData的方式,它只需提供一个json字串即可,第三个是读取一个包含json字符的文本流来创建一个JsonData。

JsonMapper中还有一个ToObject方法:

 

  
  
  
  
  1. public static T ToObject<T>(); 

当然它也有三个重载,同上,目前我主要使用这个方法来创建JsonData类型的数组。

 

  
  
  
  
  1. JsonData[] jarr = JsonMapper.ToObject<JsonData[]>(s); 
  2.   
  3.   foreach (JsonData jd in jarr) 
  4.   
  5.   { 
  6.   
  7.   print(jd.IsArray);// 返回false false 
  8.   
  9.   } 

至于具体原因,主要还是用到了foreach这个循环方式,还有一个原因就是正在做Json框架的转换,一些原有的东西尽量不去更改。现在需要在原有的字串上动态添加一个节点,怎么办,使用JsonData其实很简单:

不过这里要分两种情况:即原字串为json数组和非数组。

一.非数组情况:

 

  
  
  
  
  1. JsonData j = JsonMapper.ToObject(a); 
  2.   
  3.   j[“www”] = “dsdfsd”; 
  4.   
  5.   print(JsonMapper.ToJson(j));//返回{'name':'aaa''www':'dsdfsd'

其实大家看JsonData类的这个方法就知道了:

 

  
  
  
  
  1. public JsonData this[int index] { get; set; } 
  2.   
  3.   public JsonData this[string prop_name] { get; set; } 

注意,如果指定的key相同的话,后者将会覆盖。

二.数组情况:

 

  
  
  
  
  1. JsonData j = JsonMapper.ToObject(s); 
  2.   
  3.   JsonData jdata1 = new JsonData(); 
  4.   
  5.   jdata1[“wwww”] = “wuwu”; 
  6.   
  7.   j.Add(jdata1); 
  8.   
  9.   print(JsonMapper.ToJson(j)); 
  10.   
  11.   //返回: [{'name':'lisi'},{'name':'zhangsan'},{'wwww':'wuwu'}] 

Unity3D教程手册

你可能感兴趣的:(如何)