前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity3D--网络(三)服务器返回的数据解析

Unity3D--网络(三)服务器返回的数据解析

作者头像
孙寅
发布2020-06-02 17:00:37
1.4K0
发布2020-06-02 17:00:37
举报
文章被收录于专栏:宜达数字宜达数字

使用Unity做游戏开发,包括以后的VR游戏等联网功能是必不可少的,所以跟服务器打交道也就必不可少。其实在其他语言开发环境中也需要与服务器打交道,而所使用的数据格式都是一样的。所以说,我们可以不会搭建服务器的业务逻辑,但是服务器返回给客户端的数据,是我们必须要会的。

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

目前最常见的就是Json与XML格式

1-2、什么是Json?

它是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式 JSON的格式很像C#中字典和数组,类对象 标准的Json:key必须用双引号。

代码语言:javascript
复制
{“name” : "Jack", "age" : "10"}
 {"names" :["Jack","rose","jock"] }
1-3、什么XML?

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

代码语言:javascript
复制
<photos>
    <photo name="全家福 第01张" height="80" />
    <photo name="全家福 第02张" hright="90" />
    <photo name="全家福 第03张" hright="60" />
</photos>
一个常见的XML文档一般由以下部分组成**

1-文档声明

代码语言:javascript
复制
在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型
最简单的声明
<?xml version="1.0" ?>
用encoding属性说明文档的字符编码
<?xml version="1.0" encoding="UTF-8" ?>

2-元素(Element)

代码语言:javascript
复制
一个元素包括了开始标签和结束标签
拥有内容的元素:<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)

代码语言:javascript
复制
一个元素可以拥有多个属性
<photo name="全家福 第一张" height="80" />
video元素拥有name和length两个属性
属性值必须用 双引号"" 或者 单引号'' 括住

实际上,属性表示的信息也可以用子元素来表示,比如
<photo>
    <name>全家福 第一张</name>
        <height>30</height>
</photo>
2、Json解析

先来看一段服务器返回的数据格式:

代码语言:javascript
复制
{
    "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"
        }
    ]
}

Paste_Image.png

Json基本结构一:

用{}包裹,用名称/值来表示对象中的一个属性.

代码语言:javascript
复制
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表示:

代码语言:javascript
复制
{“name” : “lilei”, “age” : “20”};
Json基本结构二:

[]包裹,表示一个对象属性下面的多个元素内容 {“Persones” :[{“name” : “LiLei”, “age” : “20”},{“name” : “HanMeiMei”, “age” : “21”}]}

案例1: 解析服务器返回的这段Json数据

此处使用LitJson进行解析

代码语言:javascript
复制
[
{"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:解析出来并给对象赋值
代码语言:javascript
复制
      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:

代码语言:javascript
复制
 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"",
                }
 
                ]
            }";

解析方式:

代码语言:javascript
复制
        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:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

代码语言:javascript
复制
XmlDocument
- CreatElement() : //创建一个元素
- AppendChild():  //往节点下追加根节点
- Save() //保存XML文件
XmlDeclaration
- CreatXMLDeclaration() // 创建XML的声明节点
XmlElement
-GetElementsByTagName() // 根据节点名称获取下面的该节点名称的子节点元素
-setAttribute() // 设置元素的属性
-GetAttribute() // 获得元素的属性
- InnetText
-InnerXML
XmlNode(XmlElement的基类)
XmlNodeList
XML数据
代码语言:javascript
复制
<Persones>
  <Person>
      <id> 1 </id>
      <name lang = “En”> jim</name>
      <damage> 100</damage>
  </Person>
   ...
</Persones>

C#解析

代码语言:javascript
复制
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);
     }
}

Paste_Image.png

Paste_Image.png

代码语言:javascript
复制
引用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!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、服务器返回的数据格式
    • 1-2、什么是Json?
      • 1-3、什么XML?
        • 一个常见的XML文档一般由以下部分组成**
        • 2、Json解析
          • Json基本结构一:
            • Json基本结构二:
              • 案例1: 解析服务器返回的这段Json数据
                • 解析2:解析出来并给对象赋值
                • XML数据
            • 3、XML解析
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档