2011-09-20 79 views
15

我從DB讀取了一個長json。 我只想要那個json的一個屬性。我可以反序列化JSON到匿名類型的C#?

我有兩個選擇: a。爲該json創建一個接口並反序列化到該接口。 (這是一個矯枉過正,因爲我只需要一個屬性?) b。找到我需要的子串(正則表達式?)

哪一個是首選?

更新:我使用.NET 3.5

回答

26

你爲什麼不反序列化使用JSON.NET的‘LINQ到JSON’的方式(JObject等),只要求你需要通過名稱值?

這是足夠動態的,所以你不需要爲創建所有的接口,但它比使用正則表達式要脆弱得多。

JObject json = JObject.Parse(text); 
JToken value = json["foo"]["bar"]; 

(我相信JSON.NET也是支持的dynamic在.NET 4中,但有在這裏使用它沒有特別的需要。)

2

在.NET 4:

可以種做些什麼像你想減去需要什麼樣的正則表達式(和你不應該使用正則表達式是這樣的!)通過這裏所描述的C#4.0的dynamic功能:http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx

唯一的缺點是,你不能保證什麼e對象的xact結構是。

上去是不是通過yourDynamicObject['blah']訪問的成員,這是更鴨型雜交yourDynamicObject.blah

在.NET 3.5:

您可以使用Json.NET:http://json.codeplex.com/

18

正則表達式必須絕對沒有任何討論。忘記它,就好像它從來沒有存在過。

創建和使用強類型是一件好事,也許我會走的路。在控制檯上

class Program 
{ 
    static void Main() 
    { 
     var json = "{ 'foo': { 'bar': 'bar value', 'baz': [ 1, 2, 3 ] } }"; 
     var serializer = new JavaScriptSerializer(); 
     dynamic value = serializer.DeserializeObject(json); 
     Console.WriteLine(value["foo"]["baz"][1]); 
    } 
} 

打印2

但是,如果你願意,你也可以使用dynamic

+0

我使用C#3.5我不認爲有動態類型。對 ? –

+2

@Elad Benda,沒有。那麼你可以使用[Json.NET](http://json.codeplex.com/),它提供了類似的語法。 –

0

這取決於。

選項A是更嚴格,嚴謹和正式的方式。然而,就像你說的那樣,這可能是過度的。 json有多胖?長期來看,期權A會留下未來潛在的可能性,您可能需要使用多個房產。

選項B絕對是非正式和直接的。它今天肯定會起作用,但未來可能需要不同的解決方案。

因此,也許你會想要將整個過程封裝在一個方法中,以隱藏來自調用客戶端的實現。僅填充單獨的屬性返回您的自定義對象。然後,如果將來需要,您可以更改該方法以利用全傾斜反序列化。

注意:我不認爲C#3.5中的匿名類型的反序列化是可能的。

1

查找子串是一個危險的優化。

是否值得優化過程(與JSON反序列化相比)並且安全地進行這樣的查找?我們不能回答是的,因爲它主要依賴於上下文。但我覺得自己說的是NO,因爲它顯然在尋找麻煩:即使它現在有效,將來當你的結構或內容發生變化時,它可能會被打破。

1

舊的線程,但這裏有另一種方法在.NET 3.5上:您可以將由DeserializeObject返回的對象轉換爲字典<字符串,對象>。它與使用.NET 4.0動態關鍵字的方法類似:

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
Object obj = serializer.DeserializeObject("{ 'name': 'vinicius fonseca', 'age': 31 }"); 
Dictionary<String, Object> ret = (Dictionary<String, Object>)obj; 
Console.WriteLine(ret["name"].GetType().Name); // Output: String 
Console.WriteLine(ret["name"].ToString()); // Output: vinicius fonseca 
Console.WriteLine(ret["age"].GetType().Name); // Output: Int32 
Console.WriteLine(ret["age"].ToString()); // Output: 31 

希望它可以幫助某人。

問候

0

你可以這樣做:

var result = JsonConvert.DeserializeAnonymousType(json, new { Foo="", Bar=""}); 

這將返回一個動態對象與你定義的字段。

+0

您能否詳細說明您的答案,並添加關於您提供的解決方案的更多描述? – abarisone