2015-07-21 53 views
1

我在這個論壇上有很多變體的主題掙扎,但我似乎無法找到一個適合我的人,我認爲這是因爲我的JSON數組是:(我不是一個專家,但我已經設法「幾乎」得到結束..我需要得到「狀態」和「listOfCredDetails」值的手如何反序列化C#中的JSON數組#

我的JSON(稱爲responseFromServer):

{ 
"Status": { 
      "StatusCode":143, 
      "SubStatus":0, 
      "Description":"Ok" 
      }, 
"ListofCredDetails": 
        [{ 
        "Client":"a", 
        "CredID":111, 
        "CredUserID":"abc" 
        }, 
        { 
        "Client":"b", 
        "CredID":112, 
        "CredUserID":"def" 
        }, 
        { 
        "Client":"c", 
        "CredID":113, 
        "CredUserID":"ghi" 
        }] 
    } 

然後,基於很多在這個論壇上的例子,以點點滴滴我創造了我的班:

[Serializable] 
public class StatusReturn 
    { 
     public int StatusCode { get; set; } 
     public int SubStatus { get; set; } 
     public string Description { get; set; } 
    } 


[Serializable] 
public class CredDetailsReturn 
{ 
    public string Client{ get; set; } 
    public int CredID{ get; set; } 
    public string CredUserID{ get; set; } 

} 

[Serializable] 
public class GetUserCredentialDetailsReturn 
{ 
    public StatusReturn status; 
    public List<CredDetailsReturn> listOfCredDetails; 

    public GetUserCredentialDetailsReturn() 
    { 
     status = new StatusReturn(); 
     listOfCredDetails = new List<CredDetailsReturn>(); 

    } 
} 

然後我要去反序列化得到

1「狀態」,其內容爲一個對象,並

2.「ListofCredDetails」及其元素的列表到一個對象

,然後爲「GetUserCredentialDetailsReturn」創建對象,以一次返回status(object)和ListofCredDetails(object)。

任何人都可以幫助我理解我該如何實現這個我已經嘗試了一些像下面的反序列化並將Json數據轉換爲兩個單獨的對象。

但它不工作....

public GetUserCredentialDetailsReturn InvokeRequest(RESTInvokeClass objInvoke) 
    { 

     ... 
     ... 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 

      string responseText = streamReader.ReadToEnd(); 

      GetUserCredentialDetailsReturn result = new GetUserCredentialDetailsReturn(); 
      result.status = JsonConvert.DeserializeObject<StatusReturn>(responseText); 
      result.listOfCredDetails = JsonConvert.DeserializeObject<List<CredDetailsReturn>>(responseText); 

      return result; 

     } 

    } 
+3

你應該這樣做:'GetUserCredentialDetailsReturn result = JsonConvert.DeserializeObject (responseText)'。並刪除行'result.status = ...'和'result.listOfCredDetails = ...' – Rob

+0

@ rob ...我不需要完整的JSON來反序列化成一個對象..我需要JSON數據中的「狀態」部分放入一個對象和「ListofCredDetails」(列表)將JSON中的部分數據轉換爲另一個對象.. – Shravan

+0

通常,反序列化完整的JSON文本並訪問所需的元素會簡單得多。否則,如果您確實只需要一些隔離元素,則需要使用JSON庫的較低級別部分:自行分析標記流,跟蹤對象樹並僅返回所需的元素。 – DrKoch

回答

0

您需要先將類別GetUserCredentialDetailsReturn中的屬性名稱更改爲Status,將listOfCredDetails更改爲ListofCredDetails。

然後,您可以嘗試通過下面的代碼將您的Json反序列化到您的類GetUserCredentialDetailsReturn中。

GetUserCredentialDetailsReturn result = new GetUserCredentialDetailsReturn(); 
result = JsonConvert.DeserializeObject<GetUserCredentialDetailsReturn>(responseText); 

您可以在結果讓自己的地位和listOfCredDetails。

// result.Status 
    // result.ListofCredDetails 

希望這會對你有所幫助。

0
[Serializable] 
public class GetUserCredentialDetailsReturn 
{ 
    public StatusReturn status { get; set; } 
    public List<CredDetailsReturn> listOfCredDetails { get; set; } 
} 

JsonConvert.Deserialize<GetUserCredentialDetailsReturn>(json_string) 
0

如果你需要,你需要的JSON庫的下級份(比如非常大的)JSON文件的只是一些孤立的元素,例如從Newtonsoft:

using Newtonsoft.Json; 

然後創建一個解析器,通過JSON令牌讀取:

var reader = new JsonTextReader(...); 

你會通過令牌獲得的令牌:

private void nextToken() 
    { 
     do 
     { 
      if (!reader.Read()) this.importError("unexpected end of file"); 
     } 
     while (reader.TokenType == JsonToken.Comment); 
    } 

,並在一個令牌分析器來處理這個問題。例如,如果您讀取一個數組:

private void readMyArray() 
    { 
     // StartArray 
     if (reader.TokenType != JsonToken.StartArray) this.importError("expected start of array '['"); 
     this.nextToken(); 

     while (reader.TokenType != JsonToken.EndArray) 
     { 
      this.readMyElement(); 
     }    
     // EndArray 
     if (reader.TokenType != JsonToken.EndArray) this.importError("expected end of array ']'"); 
     this.nextToken(); 
    } 

這種技術在每本關於構建編譯器的書中都有介紹。