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); }}
以上就是我写的登陆注册实现,我相信,如果看完这几个脚本代码,应该都可以理解,赶快来试一下吧。
- Unity3d-Json数据解析在登录注册本地存取的应用
- Json数据解析在Unity3d中的应用
- Json数据解析在Unity3d中的应用
- Json数据解析在Unity3d中的应用
- Json数据解析在Unity3d中的应用
- Json数据解析在Unity3d中的应用
- Json数据解析在Unity3d中的应用
- Json数据解析在Unity3d中的应用
- json数据的存取
- JavaScript实现本地数据简单存取以及Json数据存取
- Redis数据库存取并解析Json数据
- 数据存取 JSON 的使用
- ASP MVC5.0 XML存取数据的登录程序(1) 注册部分
- unity3d数据存取
- json格式解析在android的应用
- JSON数据缓存在本地
- 本地数据存取
- iOS本地数据存取
- python封装一个效率极高的 批量更新、插入合一的工具
- angular的修改,性别筛选
- oracle树查询(递归查询)
- IE8的兼容问题
- 关于Java类中的代码块 普通代码块和初始化代码块
- Unity3d-Json数据解析在登录注册本地存取的应用
- 二周第一次课 2017.10.23 相对和绝对路径、cd命令、创建和删除目录mkdir/rmdir、rm命令
- 51nod 1412 AVL树的种类
- codevs 1036 商务旅行 (lca)
- 2017_10_23-diff_trailing_cr
- LVS(二)
- setInterval
- 运行时间,常数,对数,指数,
- Python进阶之MySQL数据库的主键和外键约束