Unity网络(三)-服务器数据解析

正所谓:网络姻缘一线牵,Json与XML来相伴。

  • 欢迎关注公众号:雷潮课堂
    Unity网络(三)-服务器数据解析_第1张图片

服务器数据解析

一、服务器返回的数据格式

1-1为什么要学会数据解析
1-2服务器返回的数据

二、Json

2-1什么是Json
2-2Json解析
2-3案例1
2-4案例2

三、XML

3-1什么是XML
3-2XML解析
3-3案例

四、XML与Json区别

一、数据解析

1-1.为什么要学会数据解析

使用Unity做游戏开发,联网功能是必不可少的,所以跟服务器打交道也就必不可少。在其他语言开发环境中也需要与服务器打交道,而所使用的数据格式都是一样的。所以我们可以不会搭建服务器的业务逻辑,但是必须掌握服务器返回给客户端数据的解析,
#####1-2.服务器返回的数据格式
目前最常见的就是Json与XML格式

二、Json

2-1 什么是Json?

它是一种轻量级的数据格式,一般用于数据交互
服务器返回给客户端的数据,一般都是JSON格式(文件下载除外 http://www.jianshu.com/p/ef122b64d34f)
JSON的格式很像C#中字典和数组,类对象
标准的Json:key必须用双引号。

{“name” : "Jack", "age" : "10"}
 {"names" :["Jack","rose","jock"] }
2-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"
        }
    ]
}

Unity网络(三)-服务器数据解析_第2张图片

  • 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”}]}
2-3.案例1:

使用LitJson进行解析

[
{"id" : 10,"Name" : "Leichao","age":28},
{"id" : 20,"Name" : "LinfenPiPi","age":20},
{"id" : 30,"Name" : "SunYin","age":27}
]
  • 解析1:解析出我们可以识别的对象
 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 
2-4.案例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 

三、XML

3-1、什么XML?

全称是Extensible Markup Language,译作“可扩展标记语言”
跟JSON一样,也是常用的一种用于交互的数据格式
一般也叫XML文档(XML Document)


    
    
    


一个常见的XML文档一般由以下部分组成

  • 1-文档声明
在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型
最简单的声明

用encoding属性说明文档的字符编码

  • 2-元素(Element)
一个元素包括了开始标签和结束标签
拥有内容的元素:小黄人
没有内容的元素:
没有内容的元素简写: 

一个元素可以嵌套若干个子元素(不能出现交叉嵌套)

    
        全家福 第01张
       	  80
    
    


注意:
XML中的所有空格和换行,都会当做具体内容处理
下面两个元素的内容是不一样的
第1个


第2个

  • 3-属性(Attribute)
一个元素可以拥有多个属性

video元素拥有name和length两个属性
属性值必须用 双引号"" 或者 单引号'' 括住

实际上,属性表示的信息也可以用子元素来表示,比如

    全家福 第一张
        30

3-2、XML解析

XML的解析方式有2种
DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

XmlDocument
- CreatElement() : //创建一个元素
- AppendChild():  //往节点下追加根节点
- Save() //保存XML文件
XmlDeclaration
- CreatXMLDeclaration() // 创建XML的声明节点
XmlElement
-GetElementsByTagName() // 根据节点名称获取下面的该节点名称的子节点元素
-setAttribute() // 设置元素的属性
-GetAttribute() // 获得元素的属性
- InnetText
-InnerXML
XmlNode(XmlElement的基类)
XmlNodeList
XML数据

  
       1 
       jim
       100
  
   ...


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);
     }
}

Unity网络(三)-服务器数据解析_第3张图片

Unity网络(三)-服务器数据解析_第4张图片

引用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 Persones = new List();
        // 接着遍历所有的节点,拿到每一个节点,保存到我们的数组与集合中
        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文档

Unity网络(三)-服务器数据解析_第5张图片

四、两者的比较

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


  • 欢迎购买本课程:

腾讯课堂
Unity网络(三)-服务器数据解析_第6张图片
Unity网络(三)-服务器数据解析_第7张图片
网易云课堂
Unity网络(三)-服务器数据解析_第8张图片

你可能感兴趣的:(Unity,xml,json,网络协议)