2014-07-12 143 views
3

我從Bitly API此響應字符串:C#字符串轉換爲字典

{ "status_code": 200, 
    "status_txt": "OK", 
    "data": 
    { "long_url": "http:\/\/amazon.de\/", 
     "url": "http:\/\/amzn.to\/1mP2o58", 
     "hash": "1mP2o58", 
     "global_hash": "OjQAE", 
     "new_hash": 0 
    } 
} 

我如何把這個字符串轉換字典和怎樣訪問爲重點"url"值(沒有所有的\

+3

使用Newtonsoft JSON庫。 – Enigmativity

回答

3

如果添加一個包狀Newtonsoft的JSON來你的項目,你可以在一個匿名類型的反序列化JSON。然後你可以從中獲取網址。這可以通過Visual Studio中的NuGet獲得,並支持異步或同步序列化/反序列化。

public string GetUrl(string bitlyResponse) 
{ 
    var responseObject = new 
    { 
     data = new { url = string.Empty }, 
    }; 

    responseObject = JsonConvert.DeserializeAnonymousType(bitlyResponse, responseObject); 
    return responseObject.data.url; 
} 
6

這不僅僅是一些普通的字符串。這是一個JSON格式的數據結構,這是一種常用的和完善的格式,最初在Javascript中使用,但現在在服務和客戶端之間作爲數據傳輸機制非常普遍。

與其重新發明輪子並自己解析JSON,我建議您使用C#的現有JSON庫,如JSON.NET,它會吃掉該字符串並將其解析爲.NET對象。

下面是一個代碼示例,從JSON.NET的資料爲準,顯示出其用法:

string json = @"{ 
'href': '/account/login.aspx', 
'target': '_blank' 
}"; 

Dictionary<string, string> htmlAttributes =     
JsonConvert.DeserializeObject<Dictionary<string, string>>(json); 

Console.WriteLine(htmlAttributes["href"]); 
    // /account/login.aspx 

Console.WriteLine(htmlAttributes["target"]); 
    // _blank 
1

我會使用JSON.NET。

http://james.newtonking.com/json

MIT許可證,這意味着如果你正在做什麼商業你是好人。

我不認爲你會想直接去一個詞典,因爲有一些東西不是一對一的關係。所以你可以像下面這樣創建一個類。

public class BitlyData 
{ 
    public string LongUrl{ get; set; } 
    public string Url { get; set; } 
    public string Hash { get; set; } 
    public string GlobalHash { get; set; } 
    public string NewHash { get; set; } 
} 

然後,您可以使用Json.NET將該字符串轉換爲JObject。所以我們會調用你的字符串bitlyString。

JObject bitlyObject = JObject.Parse(bitlyString); 

現在我們只剩下要做的就是訪問數據。

BitlyData theData = JsonConvert.DeserializeObject<BitlyData>(bitlyObject["data"]); 

然後,您可以使用getters訪問url(以及其他任何部分)。

當然,你可以通過讓類處理其他位以及你只做一個序列化來使它更好。

1

1)這些類添加到您的項目

public class Rootobject 
{ 
    public int status_code { get; set; } 
    public string status_txt { get; set; } 
    public Data data { get; set; } 
} 

public class Data 
{ 
    public string long_url { get; set; } 
    public string url { get; set; } 
    public string hash { get; set; } 
    public string global_hash { get; set; } 
    public int new_hash { get; set; } 
} 

2)添加一個參考JSON.NET

3)

string jsonString= "YOUR JSON STRING"; 
    Rootobject weps = JsonConvert.DeserializeObject<Rootobject>(jsonString); 

    Console.WriteLine(weps.status_code); 
    if (weps.data != null) 
    { 
     Console.WriteLine(weps.data.url); 
     Console.WriteLine(weps.data.global_hash); 
     //... 
    } 
+1

如果他所需要的只是url,創建多個類來獲取數據是有點矯枉過正,當你可以使用匿名類型 –

+1

謝謝,我從來沒有使用DeserializeAnonymousType –

+0

當從多個休息響應中獲取特定值時,它是一個生命保護程序。 –