Appearance
JSON、XML
JSON
JSON是比较常用的一种数据格式,轻量、高效。
JSON以键值对的形式存储数据,其格式有如下两种:
json
{
"name": "tony",
"age": 18
}
[
{"id": 0001, "type": "装备"},
{"id": 0002, "type": "武器"}
]
前一种是对象形式,其成员是 键和值(值可以是数组形式);后一种是数组形式,其成员必须是对象形式的数据。
成员之间用逗号间隔,对象之间也用逗号间隔
键与值,也有称作“属性名”、“属性值”的,其含义其实是相同的,只是叫法不同。另外,属性值可以是:数字、字符串、布尔、数组、对象、null
那么,如何在C#文件里使用呢?
csharp
// 省略命名空间
// 假设需要创建如下JSON
// {
// "Animal":
// [
// {
// "name": "狮子",
// "age": 4,
// },
// {
// "name": "蛇",
// "age": 10
// }
// ]
// }
//为了能与JSON中的外层对象对应,类名必须与外层的键名相同
[Serializable] // 代表该类可以序列化
public class Animals{ // 注意这里是复数形式
public Animal[] animal;
// 由于JSON中的Animal是一个数组,所以这里也要用数组形式
}
[Serializable]
public class Animal
{
// 这里具体到了每个Animal的成员,只标明有哪些键即可
public string name;
public int age;
}
// 主类、主函数
public class MyJsonTest: MonoBehaviour
{
void Start()
{
// 创建成员
Animal p1 = new Animal();
p1.name = "狮子";
p1.age = 4;
Animal p2 = new Animal();
p2.name = "蛇";
p2.age = 10;
// 用外层对象包裹成员
Animals animals = new Animals();
animals.animal = new Animal[]{p1,p2};
// 此时,这个结构还不是JSON格式,需要手动转化一下
string JSONStr = JSONUtility.ToJSON(persons);
// ============
// 以下是将JSON格式的内容解析为程序可用的信息
Animals newAnimals = JsonUtility.FromJSON<Persons>(JSONStr);
// 取出第一个对象
Animal _animal = animals.animal[0];
// 验证是否获取成功,成功应该输出狮子
Debug.Log(_animal.name);
}
}
读取JSON,通常做法其实是从单独的JSON文件中获得JSON格式字符串,然后使用解析从而获得程序可用的数据。当然,解析可以不必自己写,有很多已经写好的第三方框架可以使用。
XML
XML相较于JSON来讲,尽管单个的节点构成比较简单,但是当数据量变多时,存储的内容结构以及字符也相应增长。下面是一段XML格式的内容
xml
<?xml version="1.0" encoding="utf-8"?>
<root>
<weapons>
<weapon id="1">
<name>屠龙刀</name>
<attack>10</attack>
</weapon>
<weapon id="2">
<name>倚天剑</name>
<attack>9.9</attack>
</weapon>
</weapons>
</root>
上述XML文件中假设了两把武器,定义了名字和攻击力。接下来看看如何在C#中使用
csharp
using UnityEngine;
using System.Xml;
public class Test : MonoBehaviour
{
private void Start()
{
// 解析XML
XmlDocument doc = new XmlDocument();
// 读取XML
doc.Load((Application.dataPath+"/test.xml"));
// 获取XML根节点
XmlElement rootElement = doc.LastChild as XmlElement; // 这里用了as进行强制转换
// 获取第一个子节点
XmlElement weapons = rootElement.FirstChild as XmlElement;
// 如果有多个,就需要遍历子节点
foreach (XmlElement xmlElement in weapons)
{
// 获取属性id
string id = xmlElement.GetAttribute("id");
// 获取名称
string name = xmlElement.ChildNodes[0].InnerText; // 这里用了数组下标的方式获取子元素
// 获取攻击力
string attack = xmlElement.ChildNodes[1].InnerText; // 注意这里是字符串格式,尽管攻击力的更好的存储数据类型应该是整型
// 输出结果
Debug.Log("id:"+id+", name:"+name+", attack:"+attack);
}
}
}
XPath
如果使用XPath解析XML文件的话,代码量会稍微少一些。但是这也是视情况而定的。
csharp
using UnityEngine;
using System.Xml;
public class Test : MonoBehaviour
{
private void Start()
{
// 解析XML
XmlDocument doc = new XmlDocument();
// 读取XML
doc.Load((Application.dataPath+"/test.xml"));
// 使用XPath语法进行解析
XmlNodeList list = doc.SelectNodes("/root/weapons/weapon/name");
// 如果有多个,就需要遍历子节点
foreach (XmlElement ele in list)
{
// 输出结果
Debug.Log(ele.InnerText);
}
}
}
CSV与Excel
Excel数据表格编辑起来比较方便;CSV则类似数据表格,但是是以逗号为分隔。
CSV的格式可能如下
屠龙刀,10
倚天剑,9.9
当数据量庞杂的时候,会难以明白其中数据的含义。这时候可以先使用Excel将各种数据记录好,然后导出为CSV