Lors de la désérialisation d'un objet JSON avec des objets imbriqués, avec une propriété obligatoire sur l'un des objets imbriqués, la désérialisation ne génère pas d'exception. Mais si j'ajoute la décoration JsonProperty.Required à l'objet de base, elle le fait (comme je m'y attendais). Cela se produit lorsque la chaîne d'entrée est le type tout à fait incorrect, mais est correctement formaté JSON. Ainsi, l'entrée problématique est "{\" Errors \ ": [\" Ceci est une erreur \ "]}" (qui est la réponse d'un webservice, soit un tableau de messages d'erreur comme celui-ci, soit c'est une UserInformationRequest correctement sérialisée). Code pour clarifier:Json.NET désérialisant l'objet imbriqué ignore JsonProperty.Required
base de l'objet JsonProperty fonctionne correctement:
public class UserInformation
{
public string ID;
...
public string LoginName;
...
}
public class UserInformationRequest
{
[JsonProperty(Required = Required.Always)]
public string TimeStamp;
public UserInformation User;
}
...
public static UserInformationRequest GetUserInformationRequestFromString(string userInformation)
{
try
{
return JsonConvert.DeserializeObject<UserRequestInformation>(userInformation);
}
catch (Exception ex)
{
//exception thrown when userInformation.TimeStamp is null, as expected
return null;
}
}
Nested JsonProperty ne fonctionne pas correctement:
public class UserInformation
{
public string ID;
...
[JsonProperty(Required = Required.Always)]
public string LoginName;
...
}
public class UserInformationRequest
{
public string TimeStamp;
public UserInformation User;
}
...
public static UserInformationRequest GetUserInformationRequestFromString(string userInformation)
{
try
{
return JsonConvert.DeserializeObject<UserRequestInformation>(userInformation);
}
catch (Exception ex)
{
//never gets here - no exception thrown if userInformation.User.LoginName is null
return null;
}
}
Compte tenu de cela, lors d'une tentative de désérialiser le tableau des erreurs dans le UserInformationRequest, un exception est correctement levée s'il existe un JsonProperty sur l'objet de base, mais il n'est jamais levé si l'objet imbriqué contient un objet JsonProperty.
travail dotnetfiddles démontrant la question: JsonProperty sur l'objet de base: https://dotnetfiddle.net/qvyPfP JsonProperty sur l'objet imbriqué: https://dotnetfiddle.net/M3F0rb
Pourriez-vous montrer la chaîne JSON « Userinformation » reçu comme paramètre dans la méthode « GetUserInformationRequestFromString » s'il vous plaît? –
@emkayultra, dans quelle (s) version (s) de .Net et Json.Net voyez-vous ce problème? –
@JonLopezGarcia - premier exemple: "{\" TimeStamp \ ": null, \" Utilisateur \ ": {\" ID \ ": 12345, \" LoginName \ ": \" nom d'utilisateur \ "}}"} ET second exemple : "{\" TimeStamp \ ": \" 2017-07-29 10:31:53 \ ", \" Utilisateur \ ": {\" ID \ ": 12345, \" LoginName \ ": null}}" – emkayultra