2010-06-01 20 views
9

關於使用C#與JSON幾乎每個問題的答案似乎是「使用JSON.NET」,但這不是我正在尋找的答案。關於如何在C#中使用JSON的困惑

的原因,我說是,從一切我已經能夠在文件中讀取,JSON.NET基本上是DataContractSerializer的的性能更好的版本,內置在.NET框架...

這意味着如果我想反序列化一個JSON字符串,我必須爲每個可能的請求定義完整的,強類型的類。因此,如果我需要獲取類別,帖子,作者,標籤等,我必須爲這些東西中的每一個定義一個新類。

這很好,如果我建立客戶端,並確切知道字段是什麼,但我使用別人的API,所以我不知道什麼合同是除非我下載示例響應字符串和手動創建類來自JSON字符串。

這是唯一的方法呢?有沒有辦法讓它創建一種可以用json [「propertyname」]讀取的散列表?

最後,如果我必須自己構建類,那麼當API發生變化並且他們不告訴我(因爲twitter似乎臭名昭着)會發生什麼?我猜我的整個項目將打破,直到我進入並更新對象屬性...

那麼,使用JSON時的一般工作流程究竟是什麼?一般來說,我的意思是圖書館不可知論者。我想知道它是如何完成的,而不是專門針對目標庫...

+0

另外:有沒有一種工具來自動執行基於JSON字符串的這些數據契約?一些apis有返回類型的DOZENS,這將是堅果嘗試,使他們都... – SelAromDotNet 2010-06-01 15:26:25

回答

5

因爲您如何使用json,因此如何根據您的要求很難與庫無關,這取決於您使用的庫。作爲JSON.NET中的一個例子,您可以使用多種方式使用JSON。你有直接序列化到對象中的方法。這是類型安全的,但如果API中的數據發生更改,將會中斷。但是,還有一個LINQ-to-JSON提供了一個JObject(它的行爲與XElement相當類似),它提供了一種方法來執行JObject [「key」],就像你在問題中所要求的那樣。如果你真的只是尋找一種靈活的方式來處理C#中的JSON,那麼請查看JSON.NET的LINQ-to-JSON。

事實上,無論你如何做,如果API改變你的代碼很可能會破壞。即使你僅僅是一個基於散列表的方法,如果數據返回的變化,你的代碼仍然可能會中斷。

編輯

JSON.NET Documentation

Examples

如果檢查出的例子中,第二個應該給你的LINQ到JSON是如何工作的一個很好的例子。它允許您在不定義任何類的情況下使用它。一切都被轉換爲標準框架類(主要是集合和字符串)。這避免了維護類的需要。

+0

謝謝你的回覆! json.net是否有任何工具來簡化這些合同的開發?一些apis有幾十個返回對象,這將是一個痛苦,必須寫所有,特別是如果我使用它來訪問多個apis從不同的提供者... – SelAromDotNet 2010-06-01 15:44:08

+0

隨着JSON.NET Linq的東西,你沒有明確定義返回對象。你通過數組處理JSON,很大程度上就像在JavaScript中一樣。通過一些鏈接更新了答案。 – Stephan 2010-06-01 16:01:16

+0

ahh Examples鏈接看起來像我正在尋找的東西,再次感謝! 最後一個問題是,如果我確定我想使用強類型對象,我是否限於通過從返回的JSON字符串的示例映射手動派生我的類? 也就是說,我必須發出一個請求,得到返回的JSON字符串,在記事本中打開它並從我在字符串中看到的字段自己創建類? 或者是否有任何種類的工具來幫助自動執行此操作? 再次感謝! – SelAromDotNet 2010-06-01 16:06:33

0

我已經是Perl開發人員十多年了,最近我剛剛開始在C#中工作。我很驚訝我有多喜歡它(我根本不喜歡Java),但其中一個最困難的認知轉換是從「一切可以看作是一個字符串,並且該語言負責轉換」到「Pre - 定義你的類型。「在這種情況下,字符串思考可能是一個優勢,因爲這就是你需要爲你要求的那種API做的事情。

您需要編寫一個理解the syntax的JSON解析器,它非常簡單:用逗號分隔的列表,鍵/值對,用於哈希/對象的{},用於數組的用法,以及引用/轉義構造。您需要創建一個Hashtable來啓動,因爲JSON中的頂級實體始終是一個對象,然後逐字符地掃描JSON字符串。拉出鍵/值對;如果該值以{開始,然後將其添加爲新的Hashtable,如果它以[將其添加爲新的ArrayList,否則將其添加爲字符串。如果你得到{或[你需要遞歸下降來添加子數據元素。

如果.NET有一個很好的遞歸下降解析器,你可以使用它來使工作更簡單或更健壯,但是JSON足夠簡單,使它成爲一個很好且合理的可完成的練習。

+0

正如Stephen在他的迴應中所指出的那樣,只要您不依賴於特定的鍵/值,這種方法就沒有問題。例如,如果您只是顯示JSON數據結構,則不需要事先知道密鑰。但是,如果您的應用程序要使用硬編碼的鍵名稱,則會綁定到服務的API,並且如果API發生更改,您可能會中斷。也就是說,基於字符串的方法比典型的強類型系統更強大。像這樣的強類型接口通常不能處理任何更改,而基於字符串的系統可以使用例如:new keys – DougWebb 2010-06-01 16:24:23