本文主要記錄一下JSON文件解析過程中的兩種基本操作方式。
JSON文件的根可以是數組,也可以是對象。接下來就是基於這兩種情況進行基本的JSON文件解析。
首先看以數組爲根的JSON文件解析:
創建一個JSON文本文件json.txt如下:
[
{
"id": 1,
"name": "天下無雙",
"damage": "123"
},
{
"id": 2,
"name": "雌雄難辨",
"damage": "182"
},
{
"id": 3,
"name": "暗流涌動",
"damage": "89"
}
]
接下來是JSON文件解析的所得屬性所對應的承接的對象的數據結構:
class Skill
{
private int id { get; set; }
private string name { get; set; }
private int damage { get; set; }
public Skill(int id,string name,int damage)
{
this.id = id;
this.name = name;
this.damage = damage;
}
public override string ToString()
{
string s = "";
s += id;
s += name;
s += damage;
return s;
}
}
下面是是解析JSON文件的主方法:
class Program
{
static void Main(string[] args)
{
#region
List<Skill> list = new List<Skill>();
//將JSON文件解析成對象形式存儲到jsonData對象數組中
JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json.txt"));
foreach (JsonData temp in jsonData)
{
Skill skill = null;
JsonData idValue = temp["id"];
JsonData nameValue = temp["name"];
JsonData damageValue = temp["damage"];
int id = int.Parse(idValue.ToString());
string name = nameValue.ToString();
int damage = int.Parse(damageValue.ToString());
skill = new Skill(id, name, damage);
list.Add(skill);
}
foreach (Skill temp in list)
{
Console.WriteLine(temp);
}
Console.Read();
#endregion
}
}
接着來看以對象爲根其中嵌套一個對象數組的JSON文件的解析過程:
創建一個player.txt文件:
{
"name": "feiyue",
"level": 99,
"age": 18,
"skillList": [
{
"id": 1,
"name": "天下無雙",
"damage": "123"
},
{
"id": 2,
"name": "雌雄難辨",
"damage": "182"
},
{
"id": 3,
"name": "暗流涌動",
"damage": "89"
}
]
}
下面是承接JSON文件中屬性的對象的數據結構:
class Player
{
private string name;
private int level;
private int age;
private List<Skill> skillList;
public Player(string name,int level,int age,List<Skill> skillList)//對列表的初始化 就用實例賦值的方法
{//所以就要求在解析完json後將列表的對象信息先做成一個對象列表,再傳給構造函數
this.name = name;
this.level = level;
this.age = age;
this.skillList = skillList;
}
public override string ToString()
{
string s = "";
s += name;
s += level;
s += age;
foreach (Skill temp in skillList)
{
s += temp.ToString();//因爲我已經重寫了skill中的tostring()方法,所以這樣就可以返回一個字符串
}
return s;
}
}
接下來是解析JSON文件的主要方法:
class Program
{
static void Main(string[] args)
{
#region
JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("player.txt"));
JsonData temp = jsonData;
Player player = null;
JsonData nameValue = temp["name"];
JsonData levelValue = temp["level"];
JsonData ageValue = temp["age"];
List<Skill> list = new List<Skill>();//創建一個空的對象列表,用來存放解析出來的對象數組
foreach (JsonData item in temp["skillList"])
{
JsonData idValue = item["id"];
JsonData nameValue1 = item["name"];
JsonData damageValue = item["damage"];
int id = int.Parse(idValue.ToString());
string name1 = nameValue1.ToString();
int damage = int.Parse(damageValue.ToString());
//因爲是一個對象中包含一個對象數組,所以需要將這個對象數組先做成一個對象列表,然後再與其他對象屬性一起調用目標對象的構造函數
Skill skill = null;
skill = new Skill(id, name1, damage);
list.Add(skill);
}
string name = nameValue.ToString();
int level = int.Parse(levelValue.ToString());
int age = int.Parse(ageValue.ToString());
player = new Player(name, level, age, list);
Console.WriteLine(player);
Console.Read();
#endregion
}
}
上述兩種解析方法是解析JSON文件的基礎方法,還有一些用泛型的方法簡便地解析當JSON文件中對象是同一類型時的文件,但是當JSON文件中的對象不是同一類型時,比如JSON文件中存儲的多個對象,這些對象都繼承於一個公共基類,同時他們又保存有自身的一些屬性方法,此時就不能用泛型的方法進行解析了。就需要使用這種基本的方法構造適當的對象數據結構,進行解析。這是基礎,複雜的解析過程是由這些基礎的方式累積而成的。