这里写目录标题
一、JSON
用字符串的形式表示JSON对象
JSON(JavaScript Object Notation)JavaScript对象表示法
var obj={“Name”:“小奇”,“Age”:19}
JSON是一种轻量级的数据交换语言
JSON是存储和交换文本信息的语法。类似XML
JSON比XML更更小、更快、更容易解析
{
“employees”:[
{“firstName”:“bill”,“lastName”:“tom”},
{“firstName”:“mike”,“lastName”:“lady”},
{“firstName”:“ben”,“lastName”:“su”}
]
}
employees对象是包含了3个员工对象的数组
2.
数据是以键-值对的形式表示的
“firstName”:“bill”
数据值的类型:
数字(整数或浮点数)
字符串(在双引号中)
逻辑值(true 或 false)
数组(在方括号[]中)
对象(在花括号{}中)
数据之间用逗号分隔:
“firstName”:“ben”,“lastName”:“su”
花括号表示对象:
{“firstName”:“ben”,“lastName”:“su”}
方括号表示数组:
[a,b,c]
如何解析JSON呢?
首先需要下载一个包Newtonsoft.Json包
选择管理NuGet程序包
如何判断安装成功呢?
数据解析:
序列化:object->string 把一个对象(不是JSON对象)转换为JSON字符串(JSON对象)
反序列化:string->object
序列化和反序列化也有强和弱之分
强类型:需要定义与string结构匹配的专用class,类中只有属性,而不是字段
弱类型:使用通用的类,只能通过名称来访问属性
强类型序列化:JsonConvert.SerializeObject(object) 返回值是字符串
代码:
强类型反序列化:JsonConvert.DeserializeObject(string)返回值是对象
代码:
using Newtonsoft.Json;
using System;
namespace jsontest
{
class Program
{
static void Main(string[] args)
{
var str = "{\"Name\":\"小奇\",\"Age\":\"19\"}";
var obj = JsonConvert.DeserializeObject<Person>(str);
Console.WriteLine(obj.Age);
Console.WriteLine(obj.Name);
}
}
public class Person {
public string Name { get; set; }
public int Age { get; set; }
}
}
弱类型序列化:JObject
using Newtonsoft.Json.Linq;
using System;
namespace jsontest
{
class Program
{
static void Main(string[] args)
{
var obj = new JObject();
obj["Name"] = "小奇";//属性赋值
obj["Age"] = "19";
var str = obj.ToString();
Console.WriteLine(str);
}
}
}
弱类型反序列化:JObject.parse(str)
代码:
using Newtonsoft.Json.Linq;
using System;
namespace jsontest
{
class Program
{
static void Main(string[] args)
{
var str="{\"Name\":\"小奇\",\"Age\":19}";
var obj = JObject.Parse(str);
Console.WriteLine(obj["Name"]);
}
}
}
二、JSON实战练习
代码:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace jsontest
{
class Program
{
static async Task Main(string[] args)
{
var client = new HttpClient();
Console.WriteLine("输入时间,使用时间格式例如20200502");
var date = Console.ReadLine();
var uri = $"http://api.k780.com/?app=life.workday&date={date}&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
var str = await client.GetStringAsync(uri);
//var obj = JObject.Parse(str);//弱类型反序列化
var obj = JsonConvert.DeserializeObject<Time>(str);//强类型反序列化
Console.WriteLine("日期:"+obj.result.date);
if (obj.result.remark == "")
{
Console.WriteLine("事件:无");
}
else {
Console.WriteLine("事件:" + obj.result.remark);
}
}
}
//以下两个类是在强类型反序列化时使用
public class Result {
public string date { get; set; }
public string remark { get; set; }
}
public class Time {
public string success { get; set; }
public Result result { get; set; }
}
}
三、XML
XML是可扩展标记语言,是一种通用的、强大的数据格式
强类型使用DataContractSerializer解析
弱类型 LINQ TO XML
强类型序列化
代码:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
namespace xmltest
{
class Program
{
static void Main(string[] args)
{
var obj = new Person { Name = "小奇", Age = 19 };
var serializer = new DataContractSerializer(typeof(Person)); //序列化器
var stream = new MemoryStream(); //数据流
serializer.WriteObject(stream,obj); //序列化的结果放在数据流中
var str = Encoding.UTF8.GetString(stream.ToArray()); //将数据流转换为字符串
Console.WriteLine(str);
}
}
public class Person {
public string Name { get; set; }
public int Age { get; set; }
}
}
强类型反序列化
代码:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
namespace xmltest
{
class Program
{
static void Main(string[] args)
{
var str = "<Person xmlns=\"http://schemas.datacontract.org/2004/07/xmltest\"><Age>19</Age><Name>小奇</Name></Person>";
var stream = new MemoryStream(Encoding.UTF8.GetBytes(str));
var serializer = new DataContractSerializer(typeof(Person));
var obj=serializer.ReadObject(stream) as Person;
Console.Write(obj.Name);
}
}
public class Person {
public string Name { get; set; }
public int Age { get; set; }
}
}