JSON

Unity3D教程:LitJson解析Json

字号+ 作者:H5之家 来源:H5之家 2017-09-10 13:00 我要评论( )

Unity3D教程:LitJson解析Json ,游戏开发者社区

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


  •   function Start() {

  •   var s : String = “{'name':'aaa'}”;

  •   var json : LitJson.JsonData = LitJson.JsonMapper.ToObject(s);

  •   print(json[“name”]);

  •   }

  •   function Update () {

  •   }

    复制代码



    JsonData实现的接口如下:

  • IJsonWrapper, IList, ICollection, IEnumerable, IOrderedDictionary, IDictionary, IEquatable<JsonData>

    复制代码



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

  •   eg:

  •   string s = “[{'name':'lisi'},{'name':'zhangsan'}]”;

  •   string a = “{'name':'aaa'}”;

  •   JsonData[] jarr = JsonMapper.ToObject<JsonData[]>(s);

  •   print(jarr. IsArray);//返回true

  •   if(jarr.IsArray){

  •   foreach(JsonData jd in jarr){

  •   print(jd[“name”]);//返回结果: lisi

  •   // zhangsan

  •   }

  •   }

  •   JsonData jdata = JsonMapper.ToObject(s);

  •   print(jdata.IsArray);//返回true

  •   if (jdata.IsArray)

  •   {

  •   for (int i = 0; i < jdata.Count;i ++ )

  •   {

  •   print(jdata[i][“name”]);//返回的结果: lisi

  •   // zhangsan

  •   }

  •   }

  •   JsonData j = JsonMapper.ToObject(a);

  •   print(j.IsArray);//返回false

  •   print(j[“name”]);//返回aaa

    复制代码



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

  •   JsonMapper.ToObject(JsonReader reader);

  •   JsonMapper.ToObject(string json);

  •   JsonMapper.ToObject(System.IO.TextReader reader);

    复制代码


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


    JsonMapper中还有一个ToObject方法:


  • public static T ToObject<T>();

    复制代码



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

  • JsonData[] jarr = JsonMapper.ToObject<JsonData[]>(s);

  •   foreach (JsonData jd in jarr)

  •   {

  •   print(jd.IsArray);// 返回false false

  •   }

    复制代码


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

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

    一.非数组情况:


  • JsonData j = JsonMapper.ToObject(a);

  •   j[“www”] = “dsdfsd”;

  •   print(JsonMapper.ToJson(j));//返回{'name':'aaa', 'www':'dsdfsd'}

    复制代码



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

  • public JsonData this[int index] { get; set; }

  •   public JsonData this[string prop_name] { get; set; }

    复制代码


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

    二.数组情况:


  • JsonData j = JsonMapper.ToObject(s);

  •   JsonData jdata1 = new JsonData();

  •   jdata1[“wwww”] = “wuwu”;

  •   j.Add(jdata1);

  •   print(JsonMapper.ToJson(j));

  •   //返回: [{'name':'lisi'},{'name':'zhangsan'},{'wwww':'wuwu'}]

    复制代码


    * 版权声明:转载时请以超链接形式标明文章原始出处和作者信息

    * 本文来自:Unity3D 教程手册

    * 本文链接:





     

  • 1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    网友点评