【Unity3D插件】在Unity中读写文件数据:LitJSON快速教程

发表于2017-09-05
评论0 2k浏览

介绍

JSON是一个简单的,但功能强大的序列化数据格式。它定义了简单的类型,如布尔,数(int和float)和字符串,和几个数据结构:list和dictionnary。

litjson是用C #编写的,它的目的是要小,快速,易用。它使用了Mono框架。


安装LitJSON

将LitJSON编译好的dll文件通过Import New Asset的方式导入到项目中,再使用Using LitJSON即可使用JSONMapper类中的简便方法。


将JSON转化为Object并可逆向转化

为了在.Net程序中使用JSON格式的数据。一个自然的方法是使用JSON文本生成一个特定的类的一个新实例;为了匹配类的格式,一般存储的JSON字符串是一个字典。

另一方面,为了将对象序列化为JSON字符串,一个简单的导出操作,听起来是个好主意。

为了这个目的,LitJSON包引入了JsonMapper类,它提供了两个用于做到  JSON转化为object 和 object转化为JSON 的主要方法。这两个方法是jsonmapper.toobject和jsonmapper.tojson。

将object转化为字符串之后,我们就可以将这个字符串很方便地在文件中读取和写入了。


一个简单的JsonMapper的例子

在下面的例子中,ToObject方法有一个泛型参数,来指定返回的某种特定的数据类型:即JsonMapper.ToObject

using LitJson; using System; public class Person
{ // C# 3.0 auto-implemented properties public string Name     { get; set; } public int Age      { get; set; } public DateTime Birthday { get; set; }
} public class JsonSample
{ public static void Main()
    {
        PersonToJson();
        JsonToPerson();
    } public static void PersonToJson()
    {
        Person bill = new Person();
        bill.Name = "William Shakespeare";
        bill.Age = 51;
        bill.Birthday = new DateTime(1564, 4, 26); string json_bill = JsonMapper.ToJson(bill);
        Console.WriteLine(json_bill);
    } public static void JsonToPerson()
    { string json = @" {
                ""Name""     : ""Thomas More"",
                ""Age""      : 57,
                ""Birthday"" : ""02/07/1478 00:00:00""
            }";
        Person thomas = JsonMapper.ToObject(json);
        Console.WriteLine("Thomas' age: {0}", thomas.Age);
    }
}

上文的输出:

{"Name":"William Shakespeare","Age":51,"Birthday":"04/26/1564 00:00:00"}
Thomas' age: 57


使用非泛型的JsonMapper.ToObject

当不存在特定的JSON数据类时,它将返回一个JSONData实例。JSONData是一种通用型可以保存任何数据类型支持JSON,包括list和dictionary。

using LitJson; using System; public class JsonSample
{ public static void Main()
    { string json = @" {
            ""album"" : {
              ""name""   : ""The Dark Side of the Moon"",
              ""artist"" : ""Pink Floyd"",
              ""year""   : 1973,
              ""tracks"" : [
                ""Speak To Me"",
                ""Breathe"",
                ""On The Run""
              ]
            }
          } ";
        LoadAlbumData(json);
    } public static void LoadAlbumData(string json_text)
    {
        Console.WriteLine("Reading data from the following JSON string: {0}",
                          json_text);
        JsonData data = JsonMapper.ToObject(json_text); // Dictionaries are accessed like a hash-table Console.WriteLine("Album's name: {0}", data["album"]["name"]); // Scalar elements stored in a JsonData instance can be cast to // their natural types string artist = (string) data["album"]["artist"]; int year   = (int) data["album"]["year"];
        Console.WriteLine("Recorded by {0} in {1}", artist, year); // Arrays are accessed like regular lists as well Console.WriteLine("First track: {0}", data["album"]["tracks"][0]);
    }
}

上面例子的输出:

Reading data from the following JSON string:
          { "album" : { "name" : "The Dark Side of the Moon", "artist" : "Pink Floyd", "year" : 1973, "tracks" : [ "Speak To Me", "Breathe", "On The Run" ]
            }
          }
Album's name: The Dark Side of the Moon Recorded by Pink Floyd in 1973 First track: Speak To Me


Reader和Writer

一些人喜欢使用stream的方式处理JSON数据,对于他们, 我们提供的接口是jsonreader和jsonwriter。

JSONMapper实际上是建立在以上两个类的基础上的,所以你可以把这两个类当成是litJSON的底层接口。


使用JsonReader

using LitJson; using System; public class DataReader
{ public static void Main()
    { string sample = @"{
            ""name""  : ""Bill"",
            ""age""   : 32,
            ""awake"" : true,
            ""n""     : 1994.0226,
            ""note""  : [ ""life"", ""is"", ""but"", ""a"", ""dream"" ]
          }";
        PrintJson(sample);
    } public static void PrintJson(string json)
    {
        JsonReader reader = new JsonReader(json);
        Console.WriteLine ("{0,14} {1,10} {2,16}", "Token", "Value", "Type");
        Console.WriteLine (new String ('-', 42)); // The Read() method returns false when there's nothing else to read while (reader.Read()) { string type = reader.Value != null ? reader.Value.GetType().ToString() : "";
            Console.WriteLine("{0,14} {1,10} {2,16}",
                              reader.Token, reader.Value, type);
        }
    }
}

输出如下:

Token      Value             Type ------------------------------------------ ObjectStart                            
  PropertyName       name    System.String
        String       Bill    System.String
  PropertyName        age    System.String
           Int 32 System.Int32
  PropertyName      awake    System.String
       Boolean       True   System.Boolean
  PropertyName          n    System.String
        Double 1994.0226 System.Double
  PropertyName       note    System.String
    ArrayStart                            
        String       life    System.String
        String is System.String
        String        but    System.String
        String          a    System.String
        String      dream    System.String
      ArrayEnd                            
     ObjectEnd

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论