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

JSON是一个简单的,但功能强大的序列化数据格式。它定义了简单的类型,如布尔,数(int和float)和字符串,和几个数据结构:list和dictionnary。可以在 http://JSON.org 了解关于JSON的更多信息。

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

安装LitJSON

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

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

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

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

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

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

一个简单的JsonMapper的例子

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

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<Person>(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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值