Unity常見的解析數據方式XML,JSON,ProtocolBuf篇(三)Json
概述
Json是一種存儲和交換文本信息的語法,類似於XML。(注意這裏兩個概念,存儲文本信息,交換文本信息)Json和xml都是一種存儲信息的數據格式,但是Json比Xml要優秀一些,三種存儲和解析數據的數據格式優先級是Protobuf>Json>XML。我們學習使用Json,首先像學習XML文檔一樣從書寫格式開始學起,如果寫Json數據都不會寫,後面的更加不用說了,寫Json數據,需要注意的地方:
書寫規則:
數據在鍵值對中
數據由逗號分隔
花括號保存對象
方括號保存數組
示例:
[
{"id":2,"name":"kill1","damage":123},
{"id":3,"name":"kill2","damage":231},
{"id":"4","name":"kill3","damage":132}
]
接下來我們來寫這樣一個Json文本信息,來用代碼進行解析。
using LitJson; //注意Jsondll的引用
namespace Json_Pro
{
class Program
{
private static List<Skill> mSkillList = new List<Skill>();
static void Main(string[] args)
{
//1.添加litjson.dll
//2.開始解析 skill.txt
//使用JsonMapper進行文本數據解析,接收解析使用JsonData
JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("Skill.txt"));
foreach (JsonData item in jsonData) //一定要確定爲jsondata型 var下面不能轉換
{
Skill skill = new Skill();
JsonData idValue = item["id"];
JsonData nameValue = item["name"];
JsonData damageValue = item["damage"];
//int id=Int32.Parse(idValue.ToString());
//string skillName = nameValue.ToString();
//int damage=Int32.Parse(damageValue.ToString());
skill.ID = Int32.Parse(idValue.ToString());
skill.Name = nameValue.ToString();
skill.Damage = Int32.Parse(damageValue.ToString());
//3.測試數據
//Console.WriteLine(id + skillName + damage);
//4.創建json數據映射類用來存儲解析出來的技能信息
mSkillList.Add(skill);
}
foreach (Skill itemSkill in mSkillList)
{
Console.WriteLine("id:"+ itemSkill.ID+" name:"+ itemSkill.Name+" damage:"+ itemSkill.Damage);
}
Console.ReadKey();
}
}
}
Json數據映射類
namespace Json_Pro
{
class Skill
{
public int ID { get; set; }
public string Name { get; set; }
public int Damage { get; set; }
}
}
接下來使用Json泛型解析文本數據
①.解析成映射類Skill類型的數組:Skill[]
static void Main(string[] args)
{
//1.添加litjson.dll
//2.開始解析 skill.txt
//使用JsonMapper進行文本數據解析,接收解析使用JsonData
Skill[] skills = JsonMapper.ToObject<Skill[]>(File.ReadAllText("Skill.txt"));
//這種方式要注意映射類和json值要對應 例如:Json :int value Map.cs: -->int value ,簡言之就是對象的鍵一定要和定義的類的字段名字一致
foreach (var item in skills)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
②.解析成映射類Skill類型的集合:List<Skill>
static void Main(string[] args)
{
List<Skill>mSkillList=new List<Skill>();
mSkillList = JsonMapper.ToObject<List<Skill>>(File.ReadAllText("Skill.txt"));
foreach (var item in mSkillList)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
我們接下來解析一個Json對象,前面的腳本記住還是需要的。
修改Json文本
{
"name":"pc",
"level":95,
"age":18,
"skillList":[
{"id":2,"name":"kill1","damage":123},
{"id":3,"name":"kill2","damage":231},
{"id":4,"name":"kill3","damage":132}
]
}
添加玩家類
class Player
{
public string name { get; set; }
public int level { get; set; }
public int age { get; set; }
public List<Skill> skillList { get; set; }
public override string ToString()
{
return string.Format("name:{0},level:{1},age:{2},skillList{3}", name, level, age,skillList);
}
}
解析
class Program
{
static void Main(string[] args)
{
Player skillInfo = JsonMapper.ToObject<Player>(File.ReadAllText("Skill.txt"));
Console.WriteLine(skillInfo);
foreach (var item in skillInfo.skillList)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
最後輸出
當然上面說的都是講文本解析出來,我們也可以將對象封裝成Json文本,調用
//將對象變成Json數據
string jsonData= JsonMapper.ToJson();