C#純技術(shù)之Class寫入Json
C# Class寫入Json
/// <summary> /// 寫入json文件 /// </summary> /// <param name="obj"></param> /// <param name="savePath"></param> public static void ConvertToJson(object obj, string savePath) { string str = JsonConvert.SerializeObject(obj); //json格式化 JsonSerializer jsonSerializer = new JsonSerializer(); TextReader textReader = new StringReader(str); JsonTextReader jsonTextReader = new JsonTextReader(textReader); object _object = jsonSerializer.Deserialize(jsonTextReader); if (_object != null) { StringWriter stringWriter = new StringWriter(); JsonTextWriter jsonWriter = new JsonTextWriter(stringWriter) { Formatting = Formatting.Indented, Indentation = 4, IndentChar = ' ' }; jsonSerializer.Serialize(jsonWriter, _object); File.WriteAllText(savePath, stringWriter.ToString()); } }
自定義的類不斷迭代,然后通過json樹模型寫入json文件,這樣得到的數(shù)據(jù)不僅輕量而且易讀,是數(shù)據(jù)傳輸?shù)膬?yōu)秀方式。
json和xml比較 筆者更喜歡xml
C# 操作JSON幾種方式
通過兩種在c#中常用的方式來實(shí)現(xiàn)對Json數(shù)據(jù)的序列化和反序列化,為了實(shí)現(xiàn)大多數(shù)的需求,我們采用稍微復(fù)雜一點(diǎn)的數(shù)據(jù)模型。
首先我們有以下json數(shù)據(jù)
{ ? "name": "張三", ? "age": 20, ? "idCard": "123456789", ? "birthday": "2021-01-01 00:00:00", ? "hobbys": [ ? ? { ? ? ? "sort": 1, ? ? ? "desc": "寫字" ? ? }, ? ? { ? ? ? "sort": 2, ? ? ? "desc": "游泳" ? ? } ? ] }
然后我們根據(jù)json的結(jié)構(gòu)創(chuàng)建一個(gè)實(shí)體類
private class Studet { ? ? public string name { get; set; } ? ? public int age { get; set; } ? ? public string idCard { get; set; } ? ? public DateTime birthday { get; set; } ? ? public List<hobby> hobbys { get; set; } } private class hobby { ? ? public int sort { get; set; } ? ? public string desc { get; set; } }
第一種方式:JavaScriptSerializer
//需添加引用:System.Web.Extensions //需導(dǎo)入命名空間:using System.Web.Script.Serialization; ? ? //json.txt中的數(shù)據(jù)為上面的json數(shù)據(jù) string json = File.ReadAllText("d:\\json.txt"); ? ? JavaScriptSerializer jss = new JavaScriptSerializer(); //反序列化成Studet對象 Studet student = jss.Deserialize<Studet>(json); //然后就可以直接用操作對象的方法直接點(diǎn)出來就行 //輸出:張三 Console.WriteLine(student.name); ? ? //同樣的,我們可以將上面的對象序列化成一個(gè)json數(shù)據(jù) //序列化成json string resultJson = jss.Serialize(student); Console.WriteLine(resultJson);
第二種方式:JSON.NET
//需添加引用:Newtonsoft.Json //需導(dǎo)入命名空間:using Newtonsoft.Json; using Newtonsoft.Json.Linq; ? ? ?//反序列化成對象 Studet student = JsonConvert.DeserializeObject<Studet>(json); //輸出:張三 Console.WriteLine(student.name); ? ? //序列化成json string resultJson = JsonConvert.SerializeObject(student); Console.WriteLine(resultJson);
以上是我們通過json結(jié)構(gòu)映射實(shí)體類的方式去實(shí)現(xiàn)的解析json數(shù)據(jù),很多時(shí)候我們可能并不需要,或者并不想創(chuàng)建太多的類,這時(shí)候我們可以通過以下方式去實(shí)現(xiàn)解析
//使用JObject(JSON.NET) //反序列化成JObject JObject jobj = JObject.Parse(json); //輸出:張三 Console.WriteLine(jobj["name"].ToString()); //解析hobbys ?JArray jarr = JArray.Parse(jobj["hobbys"].ToString()); //迭代jarr即可 ? ? //同樣的,假如我們有一個(gè)JObject對象 ?JObject obj = new JObject(); ?obj["name"] = "張三"; ?obj["age"] = 20; ?//輸出json數(shù)據(jù),直接ToString()就可以 ?Console.WriteLine(obj.ToString());
如果說你的Json結(jié)構(gòu)是一個(gè)數(shù)組形式的話,即[{},{},{}],我們可以通過以下方式去解析
//第一種:DataTable DataTable dt = JsonConvert.DeserializeObject<DataTable>(json); //或者使用JavaScriptSerializer dt =jss.Deserialize<DataTable>(json); //解析DataTable即可 ? ? //第二種:JArray JArray jarr = JArray.Parse(json); //然后去迭代jarr即可 foreach (var j in jarr) { ? ? Console.WriteLine(j["key"]); } ? ? //第三種,也就是我們上面提到了有實(shí)體類的情況下 List<Studet> list = JsonConvert.DeserializeObject<List<Studet>>(json);
以上基本可以解決我們的日常開發(fā)需求,個(gè)人推薦使用JSON.NET。
總結(jié)
這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C# 中類型轉(zhuǎn)換方式之顯式轉(zhuǎn)換和 as 運(yùn)算符
在 C# 中,有兩種常見的類型轉(zhuǎn)換方式:顯式轉(zhuǎn)換和as 運(yùn)算符,它們用于在不同類型之間進(jìn)行轉(zhuǎn)換,以下是對這兩種轉(zhuǎn)換方式的詳細(xì)解釋和示例說明,感興趣的朋友跟隨小編一起看看吧2024-05-05C#調(diào)用usb攝像頭的實(shí)現(xiàn)方法
這篇文章主要介紹了C#調(diào)用usb攝像頭的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02C#使用Twain協(xié)議開發(fā)一個(gè)高掃儀對接功能
這篇文章主要為大家詳細(xì)介紹了C#如何使用Twain協(xié)議開發(fā)一個(gè)高掃儀對接功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02