本篇內容主要講解“C#中怎么實現JSON功能及對象的序列化和反序列化”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C#中怎么實現JSON功能及對象的序列化和反序列化”吧!
c#中使用json功能,需要Newtonsoft.Json程序包,可以通過NuGet程序包管理器搜索Newtonsoft.Json來安裝,也可以在NuGet程序包管理器控制臺下使用以下命令來安裝:
install-package Newtonsoft.Json
然后引用NewTonSoft.Json命名空間。之后就可以將建立的對象轉換為JSON字符串了。
如下創建一個類
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
public string Description { get; set; }
}生成對象并序列化為JSON字符串
List<Student> students = new List<Student>();
students.Add(new Student { Id = 1, Name = "張三", Sex = "男", Description = "班長" });
students.Add(new Student { Id = 2, Name = "李四", Sex = "女", Description = "小組長" });
students.Add(new Student { Id = 3, Name = "王五", Sex = "男", Description = "宣傳委員" });
string studentsJson = JsonConvert.SerializeObject(students);
Console.WriteLine(studentsJson);輸出結果:
[{“Id”:1,”Name”:”張三”,”Sex”:”男”,”Description”:”班長”},{“Id”:2,”Name”:”李四”,”Sex”:”女”,”Description”:”小組長”},{“Id”:3,”Name”:”王五”,”Sex”:”男”,”Description”:”宣傳委員”}]
有時我們可能不希望某些字段參與對象的JSON序列化,此時可以在該字段上使用[JsonIgnore]特性,對象被序列化后不會包含被忽略的字段
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
[JsonIgnore]
public string Sex { get; set; }
public string Description { get; set; }
}輸出結果:
[{“Id”:1,”Name”:”張三”,”Description”:”班長”},{“Id”:2,”Name”:”李四”,”Description”:”小組長”},{“Id”:3,”Name”:”王五”,”Description”:”宣傳委員”}]
有時我們可能想在對象序列化時更換字段的輸出名稱,譬如簡化字段名稱以縮短JSON字符串的長度,此時可使用[JsonProperty]特性標識字段
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
[JsonIgnore]
public string Sex { get; set; }
[JsonProperty("Desc")]
public string Description { get; set; }
}輸出結果:
[{“Id”:1,”Name”:”張三”,”Desc”:”班長”},{“Id”:2,”Name”:”李四”,”Desc”:”小組長”},{“Id”:3,”Name”:”王五”,”Desc”:”宣傳委員”}]
如果要將生成的JSON字符串以友好的格式化形式輸出,可調用以下方法來轉換
/// <summary>
/// 格式化JSON字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private static string ConvertJsonString(string str)
{
JsonSerializer serializer = new JsonSerializer();
TextReader tr = new StringReader(str);
JsonTextReader jtr = new JsonTextReader(tr);
object obj = serializer.Deserialize(jtr);
if (obj != null)
{
StringWriter textWriter = new StringWriter();
JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
{
Formatting = Formatting.Indented,
Indentation = 4,
IndentChar = ' '
};
serializer.Serialize(jsonWriter, obj);
return textWriter.ToString();
}
else
{
return str;
}
}于是上面的JSON字符串可改用格式化的形式輸出
List<Student> students = new List<Student>();
students.Add(new Student { Id = 1, Name = "張三", Sex = "男", Description = "班長" });
students.Add(new Student { Id = 2, Name = "李四", Sex = "女", Description = "小組長" });
students.Add(new Student { Id = 3, Name = "王五", Sex = "男", Description = "宣傳委員" });
//string studentsJson = JsonConvert.SerializeObject(students);
string studentsJson = ConvertJsonString(JsonConvert.SerializeObject(students));
Console.WriteLine(studentsJson);輸出結果:
[
{
“Id”: 1,
“Name”: “張三”,
“Desc”: “班長”
},
{
“Id”: 2,
“Name”: “李四”,
“Desc”: “小組長”
},
{
“Id”: 3,
“Name”: “王五”,
“Desc”: “宣傳委員”
}
]
以下例子將構建的JSON字符串反序列化為對象,類的定義不要使用以上描述的兩個附加特性
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
//[JsonIgnore]
public string Sex { get; set; }
//[JsonProperty("Desc")]
public string Description { get; set; }
}string inputJsonString = @"[
{ Id: 1, Name: '張三', Sex: '男', Description: '班長' },
{ Id: 2, Name: '李四', Sex: '女', Description: '小組長' },
{ Id: 3, Name: '王五', Sex: '男', Description: '宣傳委員' }
]";
List<Student> objects = JsonConvert.DeserializeObject<List<Student>>(inputJsonString);
foreach (Student item in objects)
{
Console.WriteLine($"Id: {item.Id}, Name: {item.Name}, Sex: {item.Sex}, Description: {item.Description}");
}輸出結果:
Id: 1, Name: 張三, Sex: 男, Description: 班長
Id: 2, Name: 李四, Sex: 女, Description: 小組長
Id: 3, Name: 王五, Sex: 男, Description: 宣傳委員
有時候我們可能需要序列化一個對象到字符串,或者反序列化字符串到對象,如對一個類進行封裝傳輸或者存儲。這首先需要使用特性[Serializable]將該對象類型標記為可序列化
// 標記類型可序列化
[Serializable]
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
public string Description { get; set; }
}一般對象的序列化和反序列化可以用以下兩個方法來實現
/// <summary>
/// 序列化對象到字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
private static string Serialize<T>(T obj)
{
try
{
IFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, obj);
stream.Position = 0;
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Flush();
stream.Close();
return Convert.ToBase64String(buffer);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}/// <summary>
/// 反序列化字符串到對象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="str"></param>
/// <returns></returns>
public static T Deserialize<T>(T obj, string str)
{
try
{
obj = default(T);
IFormatter formatter = new BinaryFormatter();
byte[] buffer = Convert.FromBase64String(str);
MemoryStream stream = new MemoryStream(buffer);
obj = (T)formatter.Deserialize(stream);
stream.Flush();
stream.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return obj;
}以下例子使用上述兩個方法實現一般對象的序列化和反序列化
List<Student> students = new List<Student>();
students.Add(new Student { Id = 1, Name = "張三", Sex = "男", Description = "班長" });
students.Add(new Student { Id = 2, Name = "李四", Sex = "女", Description = "小組長" });
students.Add(new Student { Id = 3, Name = "王五", Sex = "男", Description = "宣傳委員" });
string studentsString = Serialize(students);
Console.WriteLine($"序列化后的對象:\n{studentsString}");
List<Student> objects = new List<Student>();
objects = Deserialize(objects, studentsString);
Console.WriteLine("反序列化后的對象:");
foreach (Student item in objects)
{
Console.WriteLine($"Id: {item.Id}, Name: {item.Name}, Sex: {item.Sex}");
}輸出結果:
序列化后的對象:
AAEAAAD/////AQAAAAAAAAAMAgAAAEJDb25zb2xlQXBwMSwgVmVyc2lvbj0xLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGwEAQAAAHxTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW0NvbnNvbGVBcHAxLlN0dWRlbnQsIENvbnNvbGVBcHAxLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAVQ29uc29sZUFwcDEuU3R1ZGVudFtdAgAAAAgICQMAAAADAAAAAwAAAAcDAAAAAAEAAAAEAAAABBNDb25zb2xlQXBwMS5TdHVkZW50AgAAAAkEAAAACQUAAAAJBgAAAAoFBAAAABNDb25zb2xlQXBwMS5TdHVkZW50BAAAABM8SWQ+a19fQmFja2luZ0ZpZWxkFTxOYW1lPmtfX0JhY2tpbmdGaWVsZBQ8U2V4PmtfX0JhY2tpbmdGaWVsZBw8RGVzY3JpcHRpb24+a19fQmFja2luZ0ZpZWxkAAEBAQgCAAAAAQAAAAYHAAAABuW8oOS4iQYIAAAAA+eUtwYJAAAABuePremVvwEFAAAABAAAAAIAAAAGCgAAAAbmnY7lm5sGCwAAAAPlpbMGDAAAAAnlsI/nu4Tplb8BBgAAAAQAAAADAAAABg0AAAAG546L5LqUCQgAAAAGDwAAAAzlrqPkvKDlp5TlkZgL
反序列化后的對象:
Id: 1, Name: 張三, Sex: 男
Id: 2, Name: 李四, Sex: 女
Id: 3, Name: 王五, Sex: 男
到此,相信大家對“C#中怎么實現JSON功能及對象的序列化和反序列化”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。