2015-03-13 236 views
1

我正在爲winforms應用程序的OAUTH2登錄。解析HTTP JSON響應 - C#

我必須向我們提供一些憑據的請求,服務器將以令牌和json格式響應。

什麼是解析出令牌值的最佳方法?

下面是響應格式:

{ 
    "access_token":"asdfasdfasdfafbasegfnadfgasdfasdfasdf", 
    "expires_in":3600, 
    "token_type":"Bearer" 
} 

回答

5

與這些屬性創建一個類,並使用JSON.NET JsonConvert.SerializeObject方法。

public class MyResponse 
{ 
    [JsonProperty("access_token")] 
    public string AccessToken { get; set; } 
    [JsonProperty("expires_in")] 
    public int ExpiresIn { get; set; } 
    [JsonProperty("token_type")] 
    public string TokenType { get; set; } 
} 

MyResponse response = new MyResponse(); 
// Fill in properties 
string json = JsonConvert.SerializeObject(response); 
+0

你應該反序列化,不能序列。一個響應被反序列化... – 2015-03-13 13:52:14

+0

想到他想構建一個響應...在這種情況下,如果您有JSON響應,請將'JsonConvert.SerializeObject'替換爲'JsonConvert.DeserializeObject (jsonString)'。 – MotoSV 2015-03-13 13:55:45

+0

@Mark ...你能確認...你想從JSON響應字符串中提取'access_token'嗎? – MotoSV 2015-03-13 13:57:01

2

對於較少的代碼,你也可以使用JSON.NET和動態類型,如下所示;

public void JValueParsingTest() 
{ 
    var jsonString = @"{""Name"":""Rick"",""Company"":""West Wind"", 
         ""Entered"":""2012-03-16T00:03:33.245-10:00""}"; 

    dynamic json = JValue.Parse(jsonString); 

    // values require casting 
    string name = json.Name; 
    string company = json.Company; 
    DateTime entered = json.Entered; 

    Assert.AreEqual(name, "Rick"); 
    Assert.AreEqual(company, "West Wind");    
} 

來源:http://weblog.west-wind.com/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing

+1

如果我不需要,我絕不會使用'dynamic'。您不希望運行時發生編譯器錯誤。 – 2015-03-13 13:58:37

+0

我認爲這取決於他是否對他的工作進行了充分的單元測試。在運行時沒有編譯器錯誤,但我知道你的意思;你想從編譯時檢查中受益。很公平。我會建議遠離任何解釋性語言! – adampolar 2015-03-13 14:43:58

+0

我想使用「動態」方法,但我的C#代碼的一部分位於iOS上的Xamarin環境中。 Apple不允許在iOS上動態生成代碼,因此「動態」不起作用。結束創建類並使用JsonConvert序列化/反序列化oauth信息,如@MotoSV所述。工作很好。但是,只是爲了增加一點關於「動態」的有用程度......我有一些服務器端代碼用於處理任意的JSON數據和一個Mongo DB。我們在那裏使用「動態」。 – Brian 2016-07-28 10:15:06