本文主要记录一下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 list = new List();
//将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 skillList;
public Player(string name,int level,int age,List 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 list = new List();//创建一个空的对象列表,用来存放解析出来的对象数组
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文件中存储的多个对象,这些对象都继承于一个公共基类,同时他们又保存有自身的一些属性方法,此时就不能用泛型的方法进行解析了。就需要使用这种基本的方法构造适当的对象数据结构,进行解析。这是基础,复杂的解析过程是由这些基础的方式累积而成的。