JSON操作

1.简介

元素类型 标识 举例
数字 直接给出 "num":666
字符串 ""标识 "name":"xiaoming"
对象 {}标识 "p":{"fruit":"apple"}
数组 []标识 "colors":["red","blue","green"]
{
  //字符串
  "type": "truck",
  //int值
  "wheeks": 6,
  //对象
  "owner": {
    "name": "John",
    "age": "42"
  },
  //数组
  "colors": [ "red", "blue", "green" ]
}

2.读取

json文件

[
  {
    "Name": "小萌",
    "Date": "20200909",
    "Have": {
      "Toys": [ "car", "ipad", "phone" ],
      "Money": 120000
    }
  },
  {
    "Name": "小名",
    "Date": "20200809",
    "Have": {
      "Toys": [ "rocket", "xbox", "sp" ],
      "Money": 180000
    }
  }
]
读取内容
内容 操作
载入JSOON JsonDocument.Parse(信息Stream)
获取根部元素 JSON文件对象.RootElement
获取数组元素 JSON文件对象[数组下标int]
获取属性 JSON文件对象.GetProperty(属性string)
using(var fs=new FileStream("test.json",FileMode.Open))
{
    using (var cmt = JsonDocument.Parse(fs))
    {
        var t = cmt.RootElement[0].GetProperty("Have").GetProperty("Toys")[2];
        WriteLine(t);
    }
}
遍历

JSON文件对象.EnumerateArray()获取可迭代集合

using (var fs = new FileStream("data.json", FileMode.Open))
{
    using (JsonDocument js = JsonDocument.Parse(fs))
    {
        foreach (var item in js.RootElement.EnumerateArray())
        {

            foreach(var jtem in item.GetProperty("Have").GetProperty("Toys").EnumerateArray())
            {
                WriteLine(jtem);
            }
        }
    }
}

3.写入

内容 操作
用来写入数组开始和结束 WriteStartArray()和WriteEndArray()
写入对象开始和结束 WriteStartObject()和WriteEndObject()
写入字符串 WriteString(名称String,内容string)
写入数字 WriteNumber(名称String,内容string)
using(var stream=new FileStream("data.json",FileMode.Create))
{
    using (var jw = new Utf8JsonWriter(stream))
    {
        //创建数组左中括号
        jw.WriteStartArray();
        //建立对象左大括号
        jw.WriteStartObject();
        //写入字符串
        jw.WriteString("date", DateTime.UtcNow);
        //写入数字
        jw.WriteNumber("temp", 42);
        //建立对象右大括号
        jw.WriteEndObject();
        //建立对象左大括号
        jw.WriteStartObject();
        //写入字符串
        jw.WriteString("date", DateTime.UtcNow);
        //写入数字
        jw.WriteNumber("temp", 43);
        //建立对象右大括号
        jw.WriteEndObject();
        //创建数组右中括号
        jw.WriteEndArray();
    }
}

写入结果

[
  {
    "date": "2020-03-18T14:11:04.9090202Z",
    "temp": 42
  },
  {
    "date": "2020-03-18T14:11:04.9106672Z",
    "temp": 43
  }
]

4.序列化与反序列化

定义与json文件对应的类,在序列化与反序列化过程中传入类型

4.1反序列化

得到一个对象

var obj=JsonSerializer.Deserialize<Person>(str);
var obj=JsonSerializer.Deserialize<List<Person>>(str);

4.2序列化

得到JSON字符串

var str=JsonSerializer.Serialize<Person>(ps);
var dt=JsonSerializer.Deserialize<List<Person>>(str);

XML操作

1.简介

类型 标识 举例
文档声明 <?xml version="1.0"?> <?xml version="1.0" encoding="utf-8" ?>
元素/标签 <标签名></标签名> <p>哈哈哈哈</p>
属性 <标签名 属性="值"/> <student age=22/>
注释 <!--注释内容--\> <!--这是标签--\>
CDATA区 <![CDATA[不想解析的内容]]> <![CDATA[<p>哈哈哈哈</p>]]>
<?xml version="1.0" encoding="utf-8" ?>
<students>
  <student>
    <name>小明</name>
    <age>17</age>>
    <class>三年一班</class>
    <read>金瓶梅</read>
  </student>
  <student>
    <name>小冰</name>
    <age>16</age>>
    <class>五年一班</class>
    <read>十日谈</read>
  </student>
  <student>
    <name>大明</name>
    <age>17</age>>
    <class>五年二班</class>
    <read>初刻拍案惊奇</read>
  </student>
</students>

2.读取

内容 操作
创建xml XmlDocument doc = new XmlDocument();
载入xml doc.Load(文件名string)
获取第一个匹配的节点 var 节点=xml.SelectSingleNode(节点名string);
获取子节点集合 节点.ChildNodes
获取属性值 节点.GetAttribute(属性名string)
获取节点名称 节点.Name
获取节点内字符 节点.InnerText
//创建xml
var xml = new XmlDocument();
//载入xml
xml.Load("yeah.xml");
//获取第一个匹配的节点
var node=xml.SelectSingleNode("students");
//遍历
foreach(var item in node.ChildNodes)
{
    var e = item as XmlElement;
    //获取节点名称
    WriteLine(e.Name);
    //获取节点属性
    WriteLine(e.GetAttribute("姓名"));
    WriteLine(e.GetAttribute("学号"));
    WriteLine(e.GetAttribute("身高"));
    //遍历子节点
    foreach (var jtem in e.ChildNodes)
    {
        var k = jtem as XmlElement;
        WriteLine(k.Name+":"+k.InnerText);
    }
}

3.写入

内容 操作
创建xml XmlDocument doc = new XmlDocument();
添加文档声明 var 节点=doc.CreateXmlDeclaration("1.0", "utf-8", "yes");
添加节点 var 节点=doc.CreateElement(名称string);
添加进入xml doc.AppendChild(节点);
设置属性 dt.SetAttribute(属性名string,属性值string)
保存 doc.Save(文件名string)
Random rnd = new Random(666);

//创建xml
XmlDocument doc = new XmlDocument();

//添加文档声明
var declaration=doc.CreateXmlDeclaration("1.0", "utf-8", "yes");
doc.AppendChild(declaration);

//添加根节点
var root=doc.CreateElement("students");
doc.AppendChild(root);

//循环添加
for(int i=0;i<3;++i)
{
    //添加子节点
    var child = doc.CreateElement("student");
    
    //设置属性
    child.SetAttribute("姓名", "小明");
    child.SetAttribute("学号", rnd.Next(10000,100000).ToString());
    child.SetAttribute("身高", rnd.Next(100,150).ToString());
    root.AppendChild(child);
    
    //添加孙子节点
    var grade1 = doc.CreateElement("语文成绩");
    grade1.InnerText = rnd.Next(100).ToString();
    var grade2 = doc.CreateElement("数学成绩");
    grade2.InnerText = rnd.Next(100).ToString();
    var grade3 = doc.CreateElement("英语成绩");
    grade3.InnerText = rnd.Next(100).ToString();
    child.AppendChild(grade1);
    child.AppendChild(grade2);
    child.AppendChild(grade3);
}
//保存文件
doc.Save("yeah.xml");

4.序列化与反序列化

定义与xml文件对应的类,在序列化与反序列化过程中传入类型

4.1序列化

T t = new T()
{
    date=DateTime.Now,
    temp=666,
};
//xml序列化器
XmlSerializer serializer = new XmlSerializer(typeof(T));
//打开文件流
using(FileStream fs=new FileStream("test.xml",FileMode.Create))
{
//序列化
    serializer.Serialize(fs,t);
}

4.2反序列化

//xml序列化器
XmlSerializer serializer = new XmlSerializer(typeof(T));
//打开文件流
using(FileStream fs=new FileStream("test.xml",FileMode.Open))
{
//反序列化
    var t=serializer.Deserialize(fs) as T;
}

csharper
1 声望3 粉丝

曲终过尽松陵路,回首烟波十四桥。