2014-02-10 227 views
1

以我塞納里奧,有一段代碼像下面在JSON響應實體:JSON反序列化散列

"hashkeys": 
{ 
    "key1":"value1", 
    "key2":"value2", 
    "key3":"value3" 
} 

像「KEY1」,「KEY2」,「KEY3」,該鍵(甚至鍵的數量)僅在運行時已知,但不能在編碼時確定。

我該如何編寫JSon實體來反序列化這種響應?我正在使用C#語言DataContractJsonSerializer。

我的測試代碼:

[DataContract] 
class Test { 
    [DataMember(Name = "hashkeys")] 
    public Dictionary<string, string> dic { get; set; } 

} 

class Program 
{ 
    public static T FromJson<T>(string strJson) where T : class 
    { 
     DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(T)); 
     using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson))) 
     { 
      return ds.ReadObject(ms) as T; 
     } 
    } 

    static void Main(string[] args) 
    { 
     string json = @"{""hashkeys"":{""key1"":""value1"",""key2"":""value2""}}"; 
     Test MyResponse = FromJson<Test>(json); 
     Console.WriteLine(MyResponse); 
    } 
} 
+0

您的測試代碼似乎工作,如果你改變JSON字符串這樣'@ 「{」「hashkeys」「:{」「key1」「:」「value1」「,」「key2」「:」「value2」「}}」' – Grundy

+0

You are right。但是在反序列化之後,我所需要的字典沒有任何價值。 –

回答

1

可以使用

stringstring一個Dictionary這樣

string json = @"{""key1"":""value1"",""key2"":""value2""}"; 
Dictonary<string,string> MyResponse =  JsonConvert.DesirializeObject<Dictionary<string,string>>(json); 
Console.WriteLine(values.Count); 
// 2 
Console.WriteLine(values["key1"]); 
// Value1 

更多的例子和參考Click Here

+0

感謝您的迴應,Kaushik和Marcin。類型Dictionary 對我很有用。但我使用DataContractJsonSerializer,而不是使用json序列化庫。 –

+0

牛頓在'json'中提供了很多特性,所以我個人比較喜歡這個。我會建議你也應該使用它。這將幫助你輕鬆完成任務。 –

+1

@WeiquanZhang反序列化爲'Dictionary '應該可以在DataContractJsonSerializer中正常工作。 – MarcinJuraszek

1

它反序列化Dictionary<string, string>

這是一組KeyValuePair<string, string>,這正是你想要處理的。 "KeyX"將成爲Key"valueX"將爲Value字典entiry。