Unity3d-Json数据解析在登录注册本地存取的应用

来源:互联网 发布:sql from() 编辑:程序博客网 时间:2024/06/13 12:19

在学习json数据解析之前,我们首先来了解一下什么是json?,json的结构是什么?有哪些规则组成?,当知道这些基本的知识后,就对json不会太陌生了,也为学习json的解析打下一个良好的。(以下基本知识介绍,我都是参考的百度百科)

1.什么是Json

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

2.JSON 语法规则

在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:

数据在键值对中
数据由逗号分隔
花括号保存对象
方括号保存数组

3.Json的结构

对象:在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。

表示对象

JSON最常用的格式是对象的 键值对。例如下面这样:

{"firstName": "Brett", "lastName": "McLaughlin"}

数组:在js中是中括号“[]”括起来的内容,数据结构为 [“java”,”javascript”,”vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

表示数组

和普通的 JS 数组一样,JSON 表示数组的方式也是使用方括号 []。

{    "people":[      {        "firstName": "Brett",                "lastName":"McLaughlin"            },      {                  "firstName":"Jason",        "lastName":"Hunter"      }    ]}

这不难理解。在这个示例中,只有一个名为 people的变量,值是包含两个条目的数组,每个条目是一个人的记录,其中包含名和姓。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示更过多的值(每个值包含多个记录)。

在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,也可以使用不同方式表示同一事物。

好了,以上就是关于json的基本介绍,下面就要开始我们的主题内容了。在这个登录注册功能的项目中,主要应用了json序列化和反序列化两个重要方法来生成和读取json数据的,我使用的是Newtonsoft插件。关于它的介绍。可以先上网上了解,这里不再累述。

首先我们需要做一个场景,里面包含有登录注册场景,如图所示:

这里写图片描述

登录界面

这里写图片描述

注册界面

建好场景后,就是要开始写代码了,我们必须先从注册入手,因为
刚开始并没有存储数据,以下是我注册脚本(Register.cs)代码:

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class Register : MonoBehaviour {    // Use this for initialization    public InputField InputFieldone;//用户账号    public InputField InputFieldtwo;//用户的密码    public InputField InputFieldthree;//确认密码    public GameObject login;//登录视图界面对象    void Start () {    }    // Update is called once per frame    void Update () {    }    /// <summary>    /// 判断注册信息是否完善    /// </summary>    public void Interpretation()    {        //判断是否输入为空        if (InputFieldone.text.Equals(string.Empty) || InputFieldtwo.text.Equals(string.Empty) || InputFieldthree.text.Equals(string.Empty))        {            Debug.LogError("账户或密码为空!!!!!!!!!");            return;        }        //判断两次输入的密码是否一致        if (!InputFieldthree.text.Equals(InputFieldtwo.text))        {            Debug.LogError("两次输入的密码不一致,请检查并重新输入");            return;        }//如果上边的判断都没问题,就要执行存储序列化了,需要调用NetCtrl.cs中的方法        if (NetCtrl.instance.Register(InputFieldone.text, InputFieldtwo.text))        {            Debug.Log("注册成功");        } }    /// <summary>    /// 单击注册按钮    /// </summary>    public void Registers()    {        Interpretation();    }    /// <summary>    /// 单击取消按钮    /// </summary>    public void Cancle()    {        //关闭注册界面        gameObject.SetActive(false);        //现实登录界面        login.SetActive(true);    }}

在开始介绍NetCtrl.cs脚本之前,我先为大家提一下Newtonsoft插件的序列化和反序列化。

在Unity中使用Newtonsoft.Json来生成和读取json时,首先需要在项目中引用:Newtonsoft.Json.dll,在代码中添加命名空间:using Newtonsoft.Json;

json序列化和反序列化两个重要方法和例子:

通过学习JsonNetSimple,可以总结为一下两个常用的方法:
1.将类(对象)序列化成对应的json语句:

//将Product对象转换为Json字符串
string json = JsonConvert.SerializeObject(product);

2.将json语句反序列化成对应的类(对象)

①此处对应的类是需要根据json语句中的数据来事先定义:
如:
[System.Serializable]
public class CharacterListItem
{
public int Id { get; set; }
public string Name { get; set; }
public int Level { get; set; }
public string Class { get; set; }
public string Sex { get; set; }
}
②然后用JsonConvert.DeserializeObject<T>()的方法反序列化成对应的类如:
//将Json字符串转换为CharacterListItem类对象
Var Object =JsonConvert.DeserializeObject<CharacterListItem>(json);

介绍完基础,下面就可以看我的NetCtrl.cs脚本:

using UnityEngine;using System.Collections;using System.Collections.Generic;using Newtonsoft.Json;public class UserInfo{    public string ID;    public string PassWord;}public class NetCtrl : MonoBehaviour {    //单例    public static NetCtrl instance;    public List<UserInfo> userInfoList = new List<UserInfo>();    // Use this for initialization    void Start () {        instance = this;        //读取数据,并将数据放到userinfo列表中,方便后边的查询,存储        string json = FileCtrl.instance.ReadFileTxt(FileType.USERINFO);        if (json.Length > 2)        {            userInfoList = JsonConvert.DeserializeObject<List<UserInfo>>(json);//对文本中的json数据进行反序列化            //Debug.Log(json + ",userInfoList count=" + userInfoList.Count);        }           }    // Update is called once per frame    void Update () {    }    /// <summary>    /// 登录事件,查询数据    /// </summary>    /// <param name="id"></param>    /// <param name="passWord"></param>    /// <returns></returns>    public bool LoginIn(string id, string passWord)    {        for (int i = 0; i < userInfoList.Count; i++)        {            if (userInfoList[i].ID == id && userInfoList[i].PassWord == passWord)            {                return true;            }        }        return false;    }    /// <summary>    /// 注册事件 0表示成功,-1表示注册过,    /// </summary>    public bool Register(string id,string passWord)    {        for (int i = 0; i < userInfoList.Count; i++)        {            if (userInfoList[i].ID == id)            {                Debug.Log("ID已经注册过了");                return false;            }        }        //创建对象,并将输入账号和密码,赋值给对象相应的属性        UserInfo info = new UserInfo();        info.ID = id;        info.PassWord = passWord;        userInfoList.Add(info);        //转换成Json格式,        string json = JsonConvert.SerializeObject(userInfoList);        Debug.Log(json);       //写进文件中,调用FileCtrl.cs脚本中的方法        FileCtrl.instance.WriteFileTxt(json, FileType.USERINFO);        return true;    }}

需要注意的是,在把数据json序列化的时候,最好打印出来,在json在线编辑器上,验证一下是否符合json语法规范,以防出错,造成不必要的麻烦,(主要是防止人为的在创建的文本中添加数据,造成输入有问题,出现错误)。如图所示:

这里写图片描述

FileCtrl.cs主要是专门针对文件存和取操作的脚本,代码如下:

using UnityEngine;using System.Collections;using System.IO;/// <summary>/// 存入文件的类型/// </summary>public enum FileType{    USERINFO,    EQUIP,}public class FileCtrl : MonoBehaviour{    public static FileCtrl instance;    string UserFile = "UserInfo.txt";    string EquipFile = "Equip.txt";    // Use this for initialization    void Awake()    {        instance = this;    }    void Start()    {    }    /// <summary>    /// 写入文件    /// </summary>    /// <param name="content"></param>    /// <param name="type"></param>    public void WriteFileTxt(string content, FileType type)    {        string path = Application.persistentDataPath + "/";        //path的路径C:\Users\Administrator\AppData\LocalLow\DefaultCompany\login        switch (type)        {            case FileType.USERINFO:                path += UserFile;                break;            case FileType.EQUIP:                path += EquipFile;                break;        }        File.WriteAllText(path, content);    }    /// <summary>    /// 读取文件类型    /// </summary>    /// <param name="content"></param>    /// <param name="type"></param>    public string ReadFileTxt(FileType type)    {        string path = Application.persistentDataPath + "/";        switch (type)        {            case FileType.USERINFO:                path += UserFile;                break;            case FileType.EQUIP:                path += EquipFile;                break;        }        if (!File.Exists(path))        {            Debug.Log("路径文件为空");            return "";        }        return File.ReadAllText(path);    }}

注册成功后会在对应的路径下创建一个txt类型文本,如图所示:
这里写图片描述

操作到这一步,注册功能已经完成了,剩下就是登陆功能了,其实,登录功能和注册几乎一样。下面请看登陆(Login.cs)脚本的代码。

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class Login : MonoBehaviour{    public InputField InputFieldone;//用户账号    public InputField InputFieldtwo;//用户的密码    public GameObject register;//注册视图界面对象    // Use this for initialization    void Start()    {    }    // Update is called once per frame    void Update()    {    }    public void login()    {        if (NetCtrl.instance.LoginIn(InputFieldone.text, InputFieldtwo.text))        {            Debug.Log("登陆成功");        }    }    public void zhuce()    {        gameObject.SetActive(false);        register.SetActive(true);    }}

以上就是我写的登陆注册实现,我相信,如果看完这几个脚本代码,应该都可以理解,赶快来试一下吧。