0

Je possède une classe Model avec une propriété GENERIC dans l'un des WebAPI, alors que lorsque j'appelle la méthode WebAPI Controller via HttpGet, je retourne l'objet, mais je peux ' t capable de DE-sérialiser la réponse JSON. Si j'ai essayé de copier la chaîne JSON dans une variable locale (valeur codée en dur de la réponse) sa DE-sérialisation bien, mais en dynamique son échec. un bon œil les classes du modèleProblème de JsonConvert.DeserializeObject dans WebAPI Résultat de la réponse - C#

Modèle générique Classe:

public class Response<T> { 
    public T Person { get; set; } 
    public string Mobile { get; set; } 
    public string Email { get; set; } 
} 

employé modèle Classe:

public class Employee { 
    public string EmpId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string OrganizationName { get; set; } 
} 

public class Celebrity { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Language { get; set; } 
} 

Je vais avoir une chaîne JSON de type Response<Celebrity>

Considérons la méthode du contrôleur WebAPI

public class PersonController : ApiController { 

    [HttpGet] 
    public Response<Celebrity> GetPerson() { 
     return new Response<Celebrity>() 
     { 
      Person = new Celebrity() 
      { 
       FirstName = "Emma", 
       LastName = "Watson", 
       Language = "English" 
      }, 
      Mobile = "222123456", 
      Email = "[email protected]" 
     }; 
    } 
} 

Dans l'application console, j'appelle la méthode WebAPI Controller et non la sérialisation DE.

string jsonContent = string.Empty; 

var apiResponse = ApiClient.GetAsync("GetPerson").Result; 
if (apiResponse.IsSuccessStatusCode) { 
    jsonContent = apiResponse.Content.ReadAsStringAsync().Result; 
    Response<Celebrity> person = JsonConvert.DeserializeObject<Response<Celebrity>>(jsonContent); 
} 

J'ai essayé l'approche suivante

Étape # 1 je copiais la valeur de apiResponse.Content.ReadAsStringAsync().Result

{"Result":{"FirstName":"Emma","LastName":"Watson","Language":"English"},"Mobile":"222123456","Email":"[email protected]"} 

Étape # 2 je la valeur hardcode de l'étape 1

string jsonContent = "{\"Result\":{\"FirstName\":\"Emma\",\"LastName\":\"Watson\",\"Language\":\"English\"},\"Mobile\":\"222123456\",\"Email\":\"[email protected]\"}"; 

Response<Celebrity> person = JsonConvert.DeserializeObject<Response<Celebrity>>(jsonContent); 

Son fonctionnement. Je ne sais pas ce que j'ai manqué.

Répondre

0

Cela peut être un problème avec le codage de la réponse API. Cela expliquerait également pourquoi la valeur codée en dur fonctionne.

Par conséquent, essayez le code suivant et voir si cela fonctionne:

string rawApiResponseString = apiResponse.Content.ReadAsStringAsync().Result; 
string jsonContent = Encoding.UTF8.GetString(Encoding.Default.GetBytes(rawApiResponseString)); 

Response<Celebrity> person = JsonConvert.DeserializeObject<Response<Celebrity>>(jsonContent); 

EDIT:

Essayez si le code suivant fonctionne:

string jsonContent = apiResponse.Content.ReadAsStringAsync().Result; 
Celebrity person = JsonConvert.DeserializeObject<Celebrity>(jsonContent); 

Le JSON string semble être sérialisé Celebrity et non Response<Celebrity>.

+0

Cependant, je reçois la même question. –

+0

@Mastero recevez-vous une exception ou ne désérialisez-vous pas? –

+0

Non, je ne reçois aucune exception Je reçois une instance par défaut du modèle, rien n'est assigné. –

0

Si vous n'avez pas trouvé de solution, cela pourrait vous aider. pouvez-vous essayer d'ajouter les Attributs, "DataContractAttribute" à la classe et "DataMemberAttribute" à tous les membres publics et essayer?

Les deux attributs se trouvent dans l'espace de noms "System.Runtime.Serialization". Vous pouvez ajouter cette référence à l'aide de "Ajouter une référence" et choisir "Assemblies", "Framework".

Fondamentalement votre classe modifiée devrait ressembler à ceci

classe Response

[DataContract] 
public class Response<T> { 
    [DataMember] 
    public T Person { get; set; } 
    [DataMember] 
    public string Mobile { get; set; } 
    [DataMember] 
    public string Email { get; set; } 
} 

de classe modèle employé

[DataContract] 
public class Employee { 
    [DataMember] 
    public string EmpId { get; set; } 
    [DataMember] 
    public string FirstName { get; set; } 
    [DataMember] 
    public string LastName { get; set; } 
    [DataMember] 
    public string OrganizationName { get; set; } 
} 
[DataContract] 
public class Celebrity { 
    [DataMember] 
    public string FirstName { get; set; } 
    [DataMember] 
    public string LastName { get; set; } 
    [DataMember] 
    public string Language { get; set; } 
}