初面网初面网

JSON、XML

JSON

JSON是比较常用的一种数据格式,轻量、高效。

JSON以键值对的形式存储数据,其格式有如下两种:

{
  "name": "tony",
  "age": 18
}

[
  {"id": 0001, "type": "装备"},
  {"id": 0002, "type": "武器"}
]

前一种是对象形式,其成员是 键和值(值可以是数组形式);后一种是数组形式,其成员必须是对象形式的数据。

成员之间用逗号间隔,对象之间也用逗号间隔

键与值,也有称作“属性名”、“属性值”的,其含义其实是相同的,只是叫法不同。另外,属性值可以是:数字、字符串、布尔、数组、对象、null

那么,如何在C#文件里使用呢?

// 省略命名空间
// 假设需要创建如下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 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#中使用

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文件的话,代码量会稍微少一些。但是这也是视情况而定的。

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

更新于 2025/2/26