2015-07-21 2 views
1

Je suis aux prises avec un sujet qui a beaucoup de variantes dans ce forum mais je n'arrive pas à trouver celui qui me convient, et je pense que c'est à cause de la façon dont mon JSON array est :(Je ne suis pas un expert mais je réussis déjà à "presque" obtenir la fin .. Je dois entrer la valeur "Status" et "listOfCredDetails"Comment désérialiser un tableau JSON en C#

Mon JSON (s'appelle 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" 
        }] 
    } 

Ensuite, à partir de nombreux exemples dans ce forum, en prenant des morceaux que j'ai créé mes classes:

[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>(); 

    } 
} 

Alors je vais désérialiser pour obtenir

1. « Etat » et ses éléments en un seul objet et

2. « ListofCredDetails » et sa liste d'éléments en un seul objet

puis créer un objet pour "GetUserCredentialDetailsReturn" pour retourner à la fois le statut (objet) et ListofCredDetails (objet) à la fois. Quelqu'un peut-il m'aider à comprendre comment puis-je y parvenir? J'ai essayé quelques-uns comme ci-dessous pour désérialiser et d'obtenir des données JSON en deux objets distincts.

Mais il ne fonctionne pas ....

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

Vous devriez faire ceci: 'GetUserCredentialDetailsReturn result = JsonConvert.DeserializeObject (responseText)'. Et supprimez les lignes 'result.status = ...'et' result.listOfCredDetails = ... ' – Rob

+0

@ rob ... Je n'ai pas besoin du JSON complet pour désérialiser en un seul objet .. J'ai besoin de la partie" Statut "des données dans JSON dans un objet et" ListofCredDetails "(liste) une partie des données dans JSON dans un autre objet .. – Shravan

+0

Habituellement, il est beaucoup plus simple de désérialiser le texte JSON complet et d'accéder aux éléments dont vous avez besoin. Sinon, si vous ne voulez vraiment que des éléments isolés, vous devez utiliser les parties de niveau inférieur de la bibliothèque JSON: Analyser le flot de jetons, suivre l'arborescence des objets et ne renvoyer que les éléments dont vous avez besoin. – DrKoch

Répondre

0

Vous devez d'abord modifier les noms de vos propriétés dans la classe GetUserCredentialDetailsReturn en tant que statut à Status et listOfCredDetails en ListofCredDetails.

Ensuite, vous pouvez essayer de désérialiser votre Json dans votre classe GetUserCredentialDetailsReturn par le code ci-dessous.

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

Vous pouvez obtenir votre statut et listOfCredDetails avec dans le résultat.

// result.Status 
    // result.ListofCredDetails 

Espérons que cela vous sera utile.

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

JsonConvert.Deserialize<GetUserCredentialDetailsReturn>(json_string) 
0

Si vous avez besoin que quelques éléments isolés d'un (par exemple très important) fichier JSON vous avez besoin des pièces de niveau inférieur de la bibliothèque JSON, par exemple de Newtonsoft:

using Newtonsoft.Json; 

Ensuite, créez un analyseur qui lit les JSON Tokens:

var reader = new JsonTextReader(...); 

Vous obtiendrez jeton par jeton:

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

et doivent gérer cela dans un jeton Parser. Par exemple si vous lisez un tableau:

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(); 
    } 

Cette technique est expliquée dans chaque livre sur les compilateurs de bâtiments.