您的位置:首页 > 移动开发 > Unity3D

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

2017-10-23 20:20 696 查看

在学习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("两次
d85d
输入的密码不一致,请检查并重新输入");
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);
}
}


以上就是我写的登陆注册实现,我相信,如果看完这几个脚本代码,应该都可以理解,赶快来试一下吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript json解析