1. 程式人生 > >.NET平臺開源專案速覽(18)C#平臺JSON實體類生成器JSON C# Class Generator

.NET平臺開源專案速覽(18)C#平臺JSON實體類生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析複雜字串,json一定要用JsonMapper麼?中介紹了簡單的JSON解析的問題,那種方法在當時的環境是非常方便的,因為不需要生成實體類,結構很容易解析。但隨著業務的變化,也會碰到超級變態的JSON,如果還按照以前的思路,會把人搞抽風掉,一旦結構變化,又要重來。所以今天給大家介紹一個簡單的方法,輕輕鬆鬆搞定超級變態的JSON,雖然需要生成實體類。它就是開源的:JSON C# Class Generator元件。 

1.複雜的JSON啥樣子?

    看看下面這個圖,文字檔案都是12K,巢狀多層,說實話,我是沒耐心看下去的。所以找了個工具結構化了一下。看圖對比:

2.使用JSON C# Class Generator介紹和使用

    使用過程很簡單,如下圖官網的截圖所示:輸入名稱空間,主類名,生成的cs檔案目錄,以及型別即可。同時右邊還有可見性,和一些簡單的配置,簡單易懂。

  

  下面看看我們演示的這個JSON的使用,是在網路找到的一段演示JSON程式碼,我自己用到的實際資料有些比這還複雜。首先我們把JSON複製到JSON C# Class Generator中,設定相關引數,如下圖所示,生成檔案後,複製到專案中,下面我們可以寫測試程式碼,看看起解析的格式:

    說明一下,我們JSON反序列需要用到Newtonsoft元件,這個相信大部分都肯定比我熟悉。將生成的檔案複製到專案中,並新增的引用,如下程式碼就反序列化OK了。是不是So Easy?

//獲取jsonzifc 
var json = File.ReadAllText("複雜JSON例子.txt");
//使用Newtonsoft反序列化
var model = JsonConvert.DeserializeObject<TestJson>(json);

    其實這個套路大部分人也都懂,但我知道的也有一些線上解析工具,但貌似遇到特別複雜的,不好整,這個工具是我見過的裡面比較簡單易用。看看解析的資料,結構化後,非常清晰,自己想要那個資料,自己去屬性依次獲取就好了。

3.就這麼完了?No,沒那麼簡單

    工具能解決的問題一般不是全部,能解決8成就很不錯了,雖然這個工具剛開始就解決了很多問題,但隨著JSON的複雜化,也碰到了一些坑,看看如何填坑。現在已經是填坑專業戶了。

3.1 為什麼要使用巢狀類(nested classes)

    為什麼在對於複雜的型別我選擇使用巢狀類,原因很簡單,結構更清晰,否則生成的cs檔案裡面一堆類,都搞不清楚那個是最外面的,對這種需求,適當的程式碼冗餘就無所謂了,我需要的是快速的拿到自己想要的資料。何況是自動生成的。當然對於簡單的型別,不使用巢狀類也是可以的,看個人習慣吧。

3.2 解析會碰到型別名稱為數字的欄位

    雖然比較奇葩,但的確是遇到了,獲取的JSON字串裡面的欄位名稱為數字,怎麼破?鬼知道人家這麼拼出來的,反正是為了採集,還得有解藥才行。既然原始的是數字,那就把原始的給改了,我們把屬性是數字的地方,都給加一個預設值,然後生成實體類,不就可以了,不過想在這麼一堆亂七八糟的東西里面把所有的數字屬性加個預設值,也不容易啊,還好有萬能的正則表示式。

我們寫一個簡單的正則表示式匹配方法,把數字屬性統一替換為前面加個預設的字母A,程式碼如下:

public static string GetNewJson(String json)
{
	Regex reg = new Regex("\"([^\"]d*)\":"); //注意裡面的引號 要用雙引號表示,而不是用反斜槓
	MatchEvaluator matchEval = new MatchEvaluator(ReplaceStar);
	return reg.Replace(json, matchEval);
}

static string ReplaceStar(Match match)
{
	string str = match.Value.Replace("\"", "").Replace(":", "");
	return "\"A" + str + "\":";
}

3.3 相同結構的,但解析為不同的類名

     很多時候某個屬性下面有多個相同結構的物件,但是會根據名稱解析為不同的類,結構基本一直,在獲取物件資料的時候,又不是陣列物件,迴圈還不好搞,那怎麼破?

     手動建一箇中間類,結構和他們一樣,使用TinyMaper,這裡有文章介紹,將這些型別預設都對映到這個中間類中,然後其他各個相同結構物件的解析只需要寫一份程式碼就OK了。看看下面的方法:

public class LineRato
{  
	public string LgMailNo;
	public string CreateTime;        
	public string EventTime;     
	public string EventAddress;     
	public string NodeType;     
	public string Timeout;

	/// <summary>將其他結構相同的類轉換為中間類</summary>
	public static LineRato GetLine<T>(T model)
	{
		TinyMapper.Bind<T, LineRato>();
		return TinyMapper.Map<LineRato>(model);
	}
}

3.4 空值導致實體類欄位缺失

    某些時候我們在第一次獲取JSON值的時候,由於某些值是空的,導致實際的JSON值裡面沒包括該欄位,所以在生成的時候實體類裡面肯定沒有這個欄位,而實際多次後發現某些情況下該值又不為空,會導致解析失敗,這個時候怎麼破?

    沒辦法破了,為了省事,看看是那裡缺少欄位,手動加上吧,就一行程式碼的事情。

  總之,在解決了80%問題後,剩下的方法比問題多多了,大家各顯神通吧。這裡只是吧自己的解決過程寫下來,最快的解決問題,OK!其他費腦細胞的事情還是給有精力的人!  

4.資源

相關推薦

.NET平臺開源專案(18)C#平臺JSON實體生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析複雜字串,json一定要用JsonMapper麼?中介紹了簡單的JSON解析的問題,那種方法在當時的環境是非常方便的,因為不需要生成實體類,結構很容易解析。但隨著業務的變化,也會碰到超級變態的JSON,如果還按照以前的思路,會把人搞抽風掉,一旦結構變化,又要重來。所

.NET平臺開源專案(12)雜湊演算法集合庫HashLib

    .NET的System.Security.Cryptography名稱空間本身是提供加密服務,雜湊函式,對稱與非對稱加密演算法等功能。實際上,大部分情況下已經滿足了需求,而且.NET實現的都是目前國際上比較權威的,標準化的演算法,所以還是安全可靠的。但也有一些場合,需要自己實現一些安全雜湊演算法。

.NET平臺開源專案(16)C#寫PDF檔案庫PDF File Writer介紹

    1年前,我在文章:這些.NET開源專案你知道嗎?.NET平臺開源文件與報表處理元件集合(三)中(第9個專案),給大家推薦了一個開源免費的PDF讀寫元件 PDFSharp,PDFSharp我2年前就看過,用過簡單的例子,不過程式碼沒有寫成專門的文章。最近在查詢資料的時候,又發現一款小巧的寫PDF檔案

.NET平臺開源專案-最快的物件對映元件Tiny Mapper之專案實踐

心情小札:近期換了工作,苦逼於22:00後下班,房間一篇狼藉~ 小翠鄙視到:"你就適合生活在垃圾堆中!!!" 看評論也是挺有價值,同時也看到許多新手同學問道在實際專案中使用的情況。 下面就原作者的程式碼的基礎上略作調整,闡述一下在實際專案場景中的使用: 第一步:瞭解類庫方法:TinyMapper 主

.NET平臺開源專案(14)最快的物件對映元件Tiny Mapper

    好久沒有寫文章,工作甚忙,但每日還是關注.NET領域的開源專案。五一休息,放鬆了一下之後,今天就給大家介紹一個輕量級的物件對映工具Tiny Mapper:號稱是.NET平臺最快的物件對映元件。那就一起看看呢。 臨時更新:感謝@ 的意見,為了避免新手誤解,這裡說明一下,Tiny Mappe

.NET平臺開源專案(20)Newlife.Core中簡單靈活的配置檔案

如果用知乎,可以關注專欄: 記得5年前開始拼命翻讀X元件的原始碼,特別是XCode,但對Newlife.Core 的東西瞭解很少,最多隻是會用用,而且用到的只是九牛一毛。裡面好用的東西太多了。 最近一年時間,零零散散又學了很多,也瞭解了很多,不會寫那總要學會用吧,今天就給大家介紹裡面非常好用的自定義配置檔

.NET平臺開源專案(19)Power BI神器DAX Studio

  PowerBI更新頻繁,已經有點更不上的節奏,一直在關注和學習中,基本的一些操作大概是沒問題,更重要的是注重Power Query,M函式,以及DAX的使用,這才是核心。     上個月研究了DAX的一些語法和公式,發現這玩意看起來簡單,但其實功能非常強大,所以就想和寫程式碼一樣,弄個工具試一下。

.NET平臺開源專案(21)Cron任務排程CronNET

Quartznet大名鼎鼎應該很少有人不知道,相關的開源專案很多,不過那東東對新手來說,有點晦澀,加上哪個Cron表示式,可能一進去雲裡霧裡的。今天給大家介紹一個簡單的在.NET平臺上執行Cron計劃任務的元件CronNET。同時也給大家推介幾個Cron表示式的工具。 1.Cron介紹和工具

.NET平臺開源專案(7)關於NoSQL資料庫LiteDB的分頁查詢解決過程

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯) 與 .NET平臺開源專案速覽(3)小巧輕量級NoSQL檔案資料庫LiteDB中,介紹了LiteDB的基本使用情況以及部分技術細節,我還沒有在實際系統中大量使用,但文章釋出後,有不少網友( )反應在實際專案中使用過,效果還

.NET平臺開源專案(11)KwCombinatorics排列組合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重點介紹了KwCombinatorics元件的使用情況,其實這個元件我5年前就開始用了,非常方便,麻雀雖小五臟俱全。所以一直非常喜歡,才寫了幾篇文章推薦給大家。最近在計算足球彩票結果組合過程中,使用的到了其功能,生成排列,非常具有代表性,而且也

.NET平臺開源專案(1)SharpConfig配置檔案讀寫元件

在.NET平臺日常開發中,讀取配置檔案是一個很常見的需求。以前都是使用System.Configuration.ConfigurationSettings來操作,這個說實話,搞起來比較費勁。不知道大家有沒有同感。所以更多時候我還是喜歡使用開源的東西,更加方便簡潔,也穩定。省去自己的麻煩。今天就介紹一個非常精緻

.NET平臺開源專案(3)小巧輕量級NoSQL檔案資料庫LiteDB

    今天給大家介紹一個不錯的小巧輕量級的NoSQL檔案資料庫LiteDB。本部落格在2013年也介紹過2款.NET平臺的開源資料庫:     上面2個數據庫我的實際的專案中用過,還不錯。當然資料量很小,主要是客戶比較變態,必須要用xml檔案儲存,就想到了,另外NDatabase只是自己覺得好玩,

.NET平臺開源專案(9)軟體序列號生成元件SoftwareProtector介紹與使用

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Software Protector序列號生成元件。今天就通過一篇簡單的文章來預覽一下其強大的功能。雖然我人為其已經基本滿足了一個軟體序列號的所有要素,但至於大家用不用得上,還得看大家的需求。總的來

.NET平臺開源專案(10)FluentValidation驗證元件深入使用(二)

    在上一篇文章:.NET平臺開源專案速覽(6)FluentValidation驗證元件介紹與入門(一) 中,給大家初步介紹了一下FluentValidation驗證元件的使用情況。文章從構建間的驗證器開始,到最後的結果,以及複雜驗證等都做了比較深入的講解和使用。但其實一個完整的元件是麻雀雖小五臟俱全

.NET平臺開源專案(2)Compare .NET Objects物件比較元件

    .NET平臺開源專案速覽今天介紹一款小巧強大的物件比較元件。可以更詳細的獲取2個物件的差別,並記錄具體差別,比較過程和要求可以靈活配置。 1.Compare .NET Objects介紹     Compare .NET Objects元件是.NET平臺用於深入比較2個.NET物件的開源元

.NET平臺開源專案(13)機器學習元件Accord.NET框架功能介紹

    Accord.NET Framework是在AForge.NET專案的基礎上封裝和進一步開發而來。因為AForge.NET更注重與一些底層和廣度,而Accord.NET Framework更注重與機器學習演算法以及提供計算機視訊、音訊、訊號處理以及統計應用相關的解決方案。該專案使用C#語言編寫,專

.NET平臺開源專案(5)深入使用與擴充套件SharpConfig元件

  上個月在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧  和 .NET平臺開源專案速覽(1)SharpConfig配置檔案讀寫元件 中都提到了SharpConfig元件,簡單輕量級,速度快,而且還有比較深入的使用介紹。在文章釋出後,也有網友提到一些問題,當時我也沒仔細去分析,在這次我親

.NET平臺開源專案(8)Expression Evaluator表示式計算元件使用

  在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Expression Evaluator驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天就通過一篇簡單的文章來預覽一下其強大的功能。本文曾在【原創】.NET開源表示式計算元

.NET平臺開源專案(4).NET文件生成工具ADB及使用

    很久以前就使用ADB這個工具來生成專案的幫助文件。功能強大,在學習一些開源專案的過程中,官方沒有提供CHM幫助文件,所以為了快速的瞭解專案結構和註釋。就生成文件來自己看,非常好用。這也是一個學習方法吧。例如本文在:   上述2篇文章中最後的資源中就手動製作了CHM幫助文件。有時候我們還可

.NET平臺開源專案(6)FluentValidation驗證元件介紹與入門(一)

    在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下FluentValidation驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天以及接下去的幾篇文章就專門介紹這個元件。不僅僅是它小,輕量級,優雅,而且一直在持續更新中