使⽤Newtonsoft.Json.dll(JSON.NET)动态解析JSON、的。。。
在开发中,我⾮常喜欢动态语⾔和匿名对象带来的⽅便,JSON.NET具有动态序列化和反序列化任意JSON内容的能⼒,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合、字典、动态对象和匿名对象),在这篇⽂章中我将通过JToken、JObject和JArray来动态解析JSON对象,使它很容易创建和检索的JSON内容⽽⽆需基础类型。通过JObject和JArray创建JSON对象我们先⽤⾮常简单的⽅法来动态创建⼀些JSON,可通过JToken派⽣的JSON.NET对象来进⾏,最常见的JToken派⽣的类是JObject和JArray。
因为JToken实现了IDynamicMetaProvider动态语⾔接⼝,所以可以使⽤dynamic关键字直观地创建动态对象,并把这个动态对象序列化为JSON字符串。
Newtonsoft.Json的地址:
例⼦1、
通过JArray和JObject来创建⼀个⾳乐专辑结构的⼀个⽰例:
//Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject {{"Entered", DateTime.Now}};
Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject();
jsonObject.Add("Entered", DateTime.Now);
dynamic album = jsonObject;
album.AlbumName = "Dirty Deeds Done Dirt Cheap";
album.Artist = "AC/DC/DVD";
album.YearReleased = DateTime.Now.Year;
album.Songs = new Newtonsoft.Json.Linq.JArray() as dynamic;
dynamic song = new Newtonsoft.Json.Linq.JObject();
song.SongName = "Dirty Deeds Done Dirt Cheap";
song.SongLength = "4:05";
album.Songs.Add(song);
song = new Newtonsoft.Json.Linq.JObject();
song.SongName = "Love at First Feel";
song.SongLength = "3:01";
album.Songs.Add(song);
song = new Newtonsoft.Json.Linq.JObject();
song.SongName = "⼩苹果";
song.SongLength = "03:32";
album.Songs.Add(song);
Console.WriteLine(album.ToString());
Console.ReadLine();
以上代码最重要的是没有明确指定类型,便可将动态对象进⾏JSON序列化,⽽JObject对象只是接收
数据,具体结构通过动态语⾔在运⾏时⽣成,这意味着此代码可以在运⾏时被编译,从⽽体现动态语⾔的优势。序列化的结果如下图所⽰:
例⼦2、
//Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject {{"Entered", DateTime.Now}};
Newtonsoft.Json.Linq.JObject jsonObject = new Newtonsoft.Json.Linq.JObject();
jsonObject.Add("Entered", DateTime.Now);
dynamic album = jsonObject;
album.AlbumName = "⾮主流歌曲";
foreach (var item in jsonObject) //循环输出动态的值 JObject(基类为JContainer、JObject和JArray)是⼀个集合,实现了IEnumerable接⼝,因此你还可以轻松地在运⾏时循环访问 {
Console.WriteLine(item.Key + "的值为:" + item.Value.ToString());
}
执⾏结果为:
例⼦3:
JObject.Parse()和JArray.Parse()⽅法导⼊JSON格式,JToken结构⽀持Parse()和Load()⽅法,这两个⽅法可以分别从字符串或各种流读取JSON数据。JValue包括最核⼼的JSON 解析能⼒,⽀持将字符串转化为我们熟悉的动态对象。将JSON字符串转换为成JObject对象,并强制转换为动态类型。
var jsonString = @"{""Name"":""⼩苹果"",""Company"":""韩国公司"", ""Entered"":""2016-11-26 00:14""}";
dynamic json = Newtonsoft.Json.Linq.JToken.Parse(jsonString) as dynamic;
string name = json.Name;
string company = json.Company;
DateTime entered = json.Entered;
Console.WriteLine("name:"+name);
Console.WriteLine("company:" + company);
Console.WriteLine("entered:" + entered);
执⾏结果:
例⼦4:
将JObject和JArray实例映射到⼀个强类型的对象,所以你可以在同⼀段代码中混合书写动态和静态类型
string jsonString1 = @"[{""Name"":""⼩苹果"",""Age"":""20""},{""Name"":""演员"",""Age"":""2""}]";
Newtonsoft.Json.Linq.JArray userAarray1 = Newtonsoft.Json.Linq.JArray.Parse(jsonString1) as Newtonsoft.Json.Linq.JArray;
List<User> userListModel = userAarray1.ToObject<List<User>>();
foreach (var userModel1 in userListModel)
{
Console.WriteLine("Name:" + userModel1.Name);
Console.WriteLine("Age:" + userModel1.Age);
}
Console.WriteLine("");
string jsonString = @"[{""Name"":""⼩苹果"",""Age"":""20""}]";
Newtonsoft.Json.Linq.JArray userAarray = Newtonsoft.Json.Linq.JArray.Parse(jsonString) as Newtonsoft.Json.Linq.JArray;
Newtonsoft.Json.Linq.JObject jObject = userAarray[0] as Newtonsoft.Json.Linq.JObject;
User userModel = jObject.ToObject<User>();
Console.WriteLine("Name:" + userModel.Name);
Console.WriteLine("Age:" + userModel.Age);
public class User
{
public string Name { set; get; }
public int Age { set; get; }
}
执⾏结果:
例⼦5、
JSON.NET对动态语⾔的⽀持,但也别忘了它对静态类型的强⼤⽀持,关于如何序列化和反序列化强类型对象,JsonConvert是⼀个⾼级别的静态类,包装更低级别的功能,但你也可以使⽤JsonSerializer类,该类可以序列化和反序列化各种流
UserType album = new UserType()
{
Type = "普通⽤户",
UserListModel = new List<User>()
{
new User()
{
Name="张三",
Age = 20
},
new User()
{
Name="李四",
Age = 30
json转换对象}
}
};
// serialize to string
string json2 = Newtonsoft.Json.JsonConvert.SerializeObject(album, Newtonsoft.Json.Formatting.Indented);
Console.WriteLine("序列化结果");
Console.WriteLine("");
Console.WriteLine(json2);
UserType userType = Newtonsoft.Json.JsonConvert.DeserializeObject<UserType>(json2);
Console.WriteLine("");
Console.WriteLine("反序列化:");
Console.WriteLine("Type:"+ userType.Type);
Console.WriteLine("");
foreach (var userModel in userType.UserListModel)
{
Console.WriteLine("Name:"+userModel.Name);
Console.WriteLine("Age:" + userModel.Age);
}
public class UserType
{
public string Type { get; set; }
public List<User> UserListModel { get; set; }
}
public class User
{
public string Name { set; get; }
public int Age { set; get; }
}
执⾏结果:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论