文档解析之JSON文档的读取

Json文本操作

Json是存储和交换文本信息的语法,类似与Xml
Json比XML更小更快更容易解析JSON是一种轻量级的数据交换格式,他是基于ECMAScript的一个子集,JSON采用完全独立于语言的文本格式,但是他也使用了类似于C语言家族的习惯,这些特性使JSON成为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成

JSON语法规则

数据在键值对中
数据有逗号分隔
大括号保存对象
中括号保存数组
Json数据的书写格式是:名称/值对
名称/值对组合中的名称写在前面,值对写在后面,中间用冒号隔开:
"firstName":"John"
JSON值可以是
数字(整数或者浮点数)
字符串
逻辑值(true或false)
数组
对象
null

JSON数据结构

json简单的说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
1、对象:对象在JS中表示为大括号括起来的内容,数据结构为{key:value,key:value,.....}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值。取值方法是 对象.key(c#对象[key])获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种
2、数组:数组在JS中是中括号括起来的内容,数据结构为["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种
经过对象和数组两种结构就可以组合成复杂的数据结构了

创建一个JSON文本文档
 
    
  1. [
  2. {"id":1,"name":"光头强","damage":1000},
  3. {"id":2,"name":"熊大","damage":100},
  4. {"id":3,"name":"大熊","damage":10},
  5. {"id":4,"name":"汤姆","damage":10000}
  6. ]


在主函数正解析JSON

1、添加JSON库的引用
 1.1、方法一、在JSON官网上下载下图程序集
 
 1.2、将此程序集放到VS项目的根目录
 
1.3、在引用管理器中的浏览选项中,通过路径找到根目录的LitJson.dll程序集,然后再点击确定
 
  方法二、右键引用,选择管理NnGet程序包
 
 
搜索并下载

2、解析JSON

 2.1、将创建的JSON文本设置为复制到输出目录
 
 
 
   
  1. //解析JSON文本
  2. //我们使用jsonMapper去解析json文本
  3. //jsondata代表一个数组或者一个对象
  4. JsonData jsondata=JsonMapper.ToObject(File.ReadAllText("JSON文本信息.txt"));
  5. foreach (JsonData temp in jsondata)//在这里temp代表一个对象
  6. {
  7. JsonData Idvalue= temp["id"]; //通过字符串索引器可以取得键值对的值
  8. JsonData Namevalue = temp["name"];
  9. JsonData Damagevalue = temp["damage"];
  10. int id=Int32.Parse(Idvalue.ToString());
  11. int damage=Int32.Parse(Damagevalue.ToString());
  12. Console.WriteLine(id+":"+Namevalue.ToString()+":"+damage);
  13. }

3、第二种解析方法

3.1、新建一个Skill类
 
    
  1. class Skill
  2. {
  3. public int id;
  4. public int damage;
  5. public string name;
  6. public override string ToString()
  7. {
  8. return $"Id: {id}, Damage: {damage}, Name: {name}";
  9. }
  10. }

3.2、在主函数中将Skill类制成一个集合,将JSON文本信息放进集合中遍历出来
 
    
  1. List<Skill> skillList=new List<Skill>();//将Skill类放进集合中
  2. //解析JSON文本
  3. //我们使用jsonMapper去解析json文本
  4. //jsondata代表一个数组或者一个对象
  5. JsonData jsondata=JsonMapper.ToObject(File.ReadAllText("JSON文本信息.txt"));
  6. foreach (JsonData temp in jsondata)//在这里temp代表一个对象
  7. {
  8. Skill skill=new Skill();
  9. JsonData Idvalue= temp["id"]; //通过字符串索引器可以取得键值对的值
  10. JsonData Namevalue = temp["name"];
  11. JsonData Damagevalue = temp["damage"];
  12. int id=Int32.Parse(Idvalue.ToString());
  13. int damage=Int32.Parse(Damagevalue.ToString());
  14. skill.id = id;
  15. skill.name = Namevalue.ToString();
  16. skill.damage = damage;
  17. skillList.Add(skill);
  18. }
  19. foreach (Skill temp in skillList)
  20. {
  21. Console.WriteLine(temp);
  22. }


4、第三种解析方法、使用泛型解析JSON

4.1、在主函数中直接用泛型解析
 
    
  1. //使用泛型去解析json,因为技能信息是一个Skill类型的数组,所以,指定的类型就是Skill[]
  2. Skill[] skillArray=JsonMapper.ToObject<Skill[]>(File.ReadAllText("JSON文本信息.txt"));//在括号内读取技能信息文本
  3. foreach (var temp in skillArray)
  4. {
  5. Console.WriteLine(temp);
  6. }

5、使用List<>集合去解析JSON

 
    
  1. //使用集合解析Json
  2. List<Skill> skillList = JsonMapper.ToObject<List<Skill>>(File.ReadAllText("JSON文本信息.txt"));
  3. foreach (var temp in skillList)
  4. {
  5. Console.WriteLine(temp);
  6. }

解析JSON注意事项,
文本信息中的键值要和类中的字段相匹配,不能有错别字,不然,识别不了

上述操作是JSON文本中是一个数组,当文本中是一个对象的时候,我们应该这么操作

1、新建一个主角信息的文本文档,注意符号永远是英文状态下的符号
 
    
  1. {
  2. "Name":"siki",
  3. "Level":10,
  4. "Age":15,
  5. "SkillList":[
  6. {"id":1,"name":"光头强","damage":1000},
  7. {"id":2,"name":"熊大","damage":100},
  8. {"id":3,"name":"大熊","damage":10},
  9. {"id":4,"name":"汤姆","damage":10000}
  10. ]
  11. }

2、新建一个角色类,注意类中的字段或属性要和文本中保持一致,因为SkillList集合无法直接转化成字符串输出,必须在主函数中遍历输出
 
    
  1. class Player
  2. {
  3. public string Name { get; set; }
  4. public int Level { get; set; }
  5. public int Age { get; set; }
  6. public List<Skill> SkillList { get; set; }
  7. public override string ToString()
  8. {
  9. return $"Name: {Name}, Level: {Level}, Age: {Age}";
  10. }
  11. }

3、在主函数中解析输出
 
   
  1. Player p = JsonMapper.ToObject<Player>(File.ReadAllText("主角信息.txt"));
  2. Console.WriteLine(p);
  3. foreach (var temp in p.SkillList)
  4. {
  5. Console.WriteLine(temp);
  6. }

进行反向操作,:把一个对象转化成JSON文本

 
    
  1. Player p=new Player();
  2. p.Name = "花无缺";
  3. p.Level = 100;
  4. p.Age = 50;
  5. string json= JsonMapper.ToJson(p);
  6. Console.WriteLine(json);

创建JSON文本,并且写入数据


使用JSON在线编译器,可以帮助检验JSON格式是否正确










你可能感兴趣的:(文档读取)