使用Unity做游戏开发,包括以后的VR游戏等联网功能是必不可少的,所以跟服务器打交道也就必不可少。其实在其他语言开发环境中也需要与服务器打交道,而所使用的数据格式都是一样的。所以说,我们可以不会搭建服务器的业务逻辑,但是服务器返回给客户端的数据,是我们必须要会的。
1、服务器返回的数据格式
目前最常见的就是Json与XML格式
1-2、什么是Json?
它是一种轻量级的数据格式,一般用于数据交互
服务器返回给客户端的数据,一般都是JSON格式(文件下载除外 http://www.jianshu.com/p/ef122b64d34f)
JSON的格式很像C#中字典和数组,类对象
标准的Json:key必须用双引号。
{“name” : "Jack", "age" : "10"}
{"names" :["Jack","rose","jock"] }
1-3、什么XML?
全称是Extensible Markup Language,译作“可扩展标记语言”
跟JSON一样,也是常用的一种用于交互的数据格式
一般也叫XML文档(XML Document)
<photos>
<photo name="全家福 第01张" height="80" />
<photo name="全家福 第02张" hright="90" />
<photo name="全家福 第03张" hright="60" />
</photos>
一个常见的XML文档一般由以下部分组成**
1-文档声明
在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型
最简单的声明
<?xml version="1.0" ?>
用encoding属性说明文档的字符编码
<?xml version="1.0" encoding="UTF-8" ?>
2-元素(Element)
一个元素包括了开始标签和结束标签
拥有内容的元素:<photo>小黄人</photo>
没有内容的元素:<photo></photo>
没有内容的元素简写:<photo/>
一个元素可以嵌套若干个子元素(不能出现交叉嵌套)
<photos>
<photos>
<name>全家福 第01张</name>
<height>80</height>
</photos>
<video>
</video>
</photos>
注意:
XML中的所有空格和换行,都会当做具体内容处理
下面两个元素的内容是不一样的
第1个
<video>小黄人</video>
第2个
<video>
小黄人
</video>
3-属性(Attribute)
一个元素可以拥有多个属性
<photo name="全家福 第一张" height="80" />
video元素拥有name和length两个属性
属性值必须用 双引号"" 或者 单引号'' 括住
实际上,属性表示的信息也可以用子元素来表示,比如
<photo>
<name>全家福 第一张</name>
<height>30</height>
</photo>
2、Json解析
先来看一段服务器返回的数据格式:
{
"name" : "jack",
"age" : 20,
"height" : 1.99,
"school" : {
“name” : “雷潮",
“address” : “深圳南山区"
},
"photos" : [
{
"icon" : "beauty.png",
"time" : "2016-01-01"
},
{
"icon" : "nice.png",
"time" : "2016-02-07"
},
{
"icon" : "good.png",
"time" : "2016-05-06"
}
]
}

Json基本结构一:
用{}包裹,用名称/值来表示对象中的一个属性.
public class Person
{
public string name;
public int age;
public Person()
{
}
public Person(string _name, int _age)
{
name = _name;
age = _age;
}
}
Person p = new Person(“lilei”,20);
用Json表示:
{“name” : “lilei”, “age” : “20”};
Json基本结构二:
[]包裹,表示一个对象属性下面的多个元素内容
{“Persones” :[{“name” : “LiLei”, “age” : “20”},{“name” : “HanMeiMei”, “age” : “21”}]}
案例1: 解析服务器返回的这段Json数据
此处使用LitJson进行解析
[
{"id" : 10,"Name" : "Leichao","age":28},
{"id" : 20,"Name" : "LinfenPiPi","age":20},
{"id" : 30,"Name" : "SunYin","age":27}
]
######解析1:解析出我们可以识别的对象
```C#
string path = "Assets/Resources/TextFile.txt";
string textOne = File.ReadAllText(path);
JsonData data1 = JsonMapper.ToObject(textOne);
for (int i = 0; i < data1.Count; i++)
{
JsonData nameValue = data1[i]["Name"];
Debug.Log(nameValue);
NameText.text = nameValue.ToString();
JsonData IDValue = data1[i]["id"];
IDText.text = IDValue.ToString();
JsonData AgeValue = data1[i]["age"];
AgeText.text = AgeValue.ToString();
Debug.Log("名字是:" + NameText + "ID:" + IDText);
}
解析2:解析出来并给对象赋值
Person[] p = new Person[] {
p1 = new Person(),
p2 = new Person(),
p3 = new Person()
};
string path = "Assets/Resources/TextFile.txt";
string textOne = File.ReadAllText(path);
JsonData data = JsonMapper.ToObject(File.ReadAllText(path));
Debug.Log(p.Length);
for (int i = 0; i <data.Count; i++)
{
JsonData idValue = data[i]["id"];
p[i].id = int.Parse(idValue.ToString());
JsonData AgeValue = data[i]["age"];
p[i].age = int.Parse(AgeValue.ToString());
JsonData nameValue = data[i]["Name"];
p[i].name = nameValue.ToString();
Debug.Log("name :" + nameValue.ToString());
}
Debug.Log("------------" +p[0].age + "++++++" + p[1].name);
}
案例2:
string str = @"
{
""Name"" : ""SunYin"",
""Age"" : 27,
""Birthday"" : ""1990-09-09"",
""Urls"":[
{
""Url"": ""http://www.jianshu.com/p/ef122b64d34f"",
},
{
""Url"": ""http://www.jianshu.com/p/a5c0844a0590"",
}
]
}";
解析方式:
JsonData data = JsonMapper.ToObject(str);
Debug.Log("name = " + (string)jd["Name"]);
Debug.Log("Age = " + (int)jd["Age"]);
Debug.Log("Birthday = " + (string)jd["Birthday"]);
JsonData dataUrls = data["Urls"];
for (int i = 0; i <dataUrls.Count; i++)
{
Debug.Log("URL = " + dataUrls[i]["Url"]);
}
}
3、XML解析
XML的解析方式有2种
DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
XmlDocument
- CreatElement() : //创建一个元素
- AppendChild(): //往节点下追加根节点
- Save() //保存XML文件
XmlDeclaration
- CreatXMLDeclaration() // 创建XML的声明节点
XmlElement
-GetElementsByTagName() // 根据节点名称获取下面的该节点名称的子节点元素
-setAttribute() // 设置元素的属性
-GetAttribute() // 获得元素的属性
- InnetText
-InnerXML
XmlNode(XmlElement的基类)
XmlNodeList
XML数据
<Persones>
<Person>
<id> 1 </id>
<name lang = “En”> jim</name>
<damage> 100</damage>
</Person>
...
</Persones>
C#解析
calss Person
{
public int ID {get;set;}
public string Name{get;set;}
public string Lang{get;set;}
public int Damage{get; set;}
public override string ToString()
{
rerturn string.Format(“id:{0},Name:{1},Lang:{2},Damage:{3}”,ID,Name,Lang,Damage);
}
}


引用System.Xml空间
// 专门用来解析XML文档的
XmlDocument doc = new XmlDocument()
// 此文件必须在程序集中
doc.load(“需要解析的文件名称”);
// 专门用来解析XML文档的
XmlDocument doc = new XmlDocument();
// 此文件必须在程序集中
// doc.Load("XML信息");
string path = "Assets/Resources/XML信息.xml";
doc.LoadXml(File.ReadAllText(path));
// 先得到根节点,第一个节点
XmlNode rootNode = doc.FirstChild;
// 获取根节点的所有节点
XmlNodeList nodeList = rootNode.ChildNodes;
// 得到所有的子节点,我们通过数组或者列表保存
List<PersonXML> Persones = new List<PersonXML>();
// 接着遍历所有的节点,拿到每一个节点,保存到我们的数组与集合中
foreach (XmlNode PersonNode in nodeList) {
XmlNodeList propertyPerson = PersonNode.ChildNodes; // 获取PersonNode下面的所有节点
PersonXML p = new PersonXML(); // Person里面有XML文档中的每一个属性
foreach (XmlNode property in propertyPerson)
{
if (property.Name == "id")
{
p.ID = int.Parse(property.InnerText); // 获取内部文本
}
else if (property.Name == "name")
{
p.Name = property.InnerText;
p.Lang = property.Attributes[0].Value;
}
else if (property.Name == "damage")
{
p.Damage = int.Parse(property.InnerText);
}
}
Debug.Log(p);
}
}
关于创建XML文档

4、两者的比较
同一份数据,既可以用JSON来表示,也可以用XML来表示
JSON的体积小于XML,所以服务器返回给移动端的数据格式以JSON居多,而对于客户端两者都ok!
网友评论