2014-07-17 3 views
0

Je l'ai utilisé JSON to C# Class Converter et génère la classe suivante:Erreur de référence d'objet lors de la lecture d'une chaîne JSON spécifique?

JSON

{"ios_info":{"serialNumber":"F2LLMBNJFFF","imeiNumber":"01388400413235","meid":"","iccID":"8901410427640096045","firstUnbrickDate":"11\/27\/13","lastUnbrickDate":"11\/27\/13","unbricked":"true","unlocked":"false","productVersion":"7.1.2","initialActivationPolicyID":"23","initialActivationPolicyDetails":"US AT&T Puerto Rico and US Virgin Islands Activation Policy","appliedActivationPolicyID":"23","appliedActivationDetails":"US AT&T Puerto Rico and US Virgin Islands Activation Policy","nextTetherPolicyID":"23","nextTetherPolicyDetails":"US AT&T Puerto Rico and US Virgin Islands Activation Policy","macAddress":"ACFDEC6C988A","bluetoothMacAddress":"AC:FD:EC:6C:98:8B","partDescription":"IPHONE 5S SPACE GRAY 64GB-USA"},"fmi":{"@attributes":{"version":"1","deviceCount":"1"},"fmipLockStatusDevice":{"@attributes":{"serial":"F2LLMBNJFFFQ","imei":"013884004132355","isLocked":"true","isLost":"false"}}},"product_info":{"serialNumber":"F2LLMBNJFFF","warrantyStatus":"Apple Limited Warranty","coverageEndDate":"11\/25\/14","coverageStartDate":"11\/26\/13","daysRemaining":"497","estimatedPurchaseDate":"11\/26\/13","purchaseCountry":"United States","registrationDate":"11\/26\/13","imageURL":"http:\/\/service.info.apple.com\/parts\/service_parts\/na.gif","explodedViewURL":"http:\/\/service.info.apple.com\/manuals-ssol.html","manualURL":"http:\/\/service.info.apple.com\/manuals-ssol.html","productDescription":"iPhone 5S","configDescription":"IPHONE 5S GRAY 64GB GSM","slaGroupDescription":"","contractCoverageEndDate":"11\/25\/15","contractCoverageStartDate":"11\/26\/13","contractType":"C1","laborCovered":"Y","limitedWarranty":"Y","partCovered":"Y","notes":"Covered by AppleCare+ - Incidents Available","acPlusFlag":"Y","consumerLawInfo":{"serviceType":"","popMandatory":"","allowedPartType":""}}} 

De-dessus JSON toutes les données sont lues mais only the line at which i get error is in reading the JSON is:

fmi":{"@attributes":{"version":"1","deviceCount":"1"},"fmipLockStatusDevice":{"@attributes":{"serial":"F2LLMBNJFFFQ","imei":"013884004132355","isLocked":"true","isLost":"false"}}}, 

Erreur:

La référence d'objet n'est pas définie sur une instance d'objet.

public class AppleAPI 
{ 
    public IosInfo ios_info { get; set; } 
    public ProductInfo product_info { get; set; } 
    public Fmi fmi { get; set; } 
    public class IosInfo 
    { 
     public string serialNumber { get; set; } 
     public string imeiNumber { get; set; } 
     public string meid { get; set; } 
     public string iccID { get; set; } 
     public string firstUnbrickDate { get; set; } 
     public string lastUnbrickDate { get; set; } 
     public string unbricked { get; set; } 
     public string unlocked { get; set; } 
     public string productVersion { get; set; } 
     public string initialActivationPolicyID { get; set; } 
     public string initialActivationPolicyDetails { get; set; } 
     public string appliedActivationPolicyID { get; set; } 
     public string appliedActivationDetails { get; set; } 
     public string nextTetherPolicyID { get; set; } 
     public string nextTetherPolicyDetails { get; set; } 
     public string macAddress { get; set; } 
     public string bluetoothMacAddress { get; set; } 
     public string partDescription { get; set; } 
    } 

    public class ConsumerLawInfo 
    { 
     public string serviceType { get; set; } 
     public string popMandatory { get; set; } 
     public string allowedPartType { get; set; } 
    } 


    public class ProductInfo 
    { 
     public string serialNumber { get; set; } 
     public string warrantyStatus { get; set; } 
     public string coverageEndDate { get; set; } 
     public string coverageStartDate { get; set; } 
     public string daysRemaining { get; set; } 
     public string estimatedPurchaseDate { get; set; } 
     public string purchaseCountry { get; set; } 
     public string registrationDate { get; set; } 
     public string imageURL { get; set; } 
     public string explodedViewURL { get; set; } 
     public string manualURL { get; set; } 
     public string productDescription { get; set; } 
     public string configDescription { get; set; } 
     public string slaGroupDescription { get; set; } 
     public string contractCoverageEndDate { get; set; } 
     public string contractCoverageStartDate { get; set; } 
     public string contractType { get; set; } 
     public string laborCovered { get; set; } 
     public string limitedWarranty { get; set; } 
     public string partCovered { get; set; } 
     public string notes { get; set; } 
     public string acPlusFlag { get; set; } 
     public ConsumerLawInfo consumerLawInfo { get; set; } 
    } 

    public class Fmi 
    { 
     public Attributes invalid_nameattribute { get; set; } 
     public FmipLockStatusDevice fmipLockStatusDevice { get; set; } 
    } 
    public class FmipLockStatusDevice 
    { 
     public Attributes2 invalid_nameattribute2 { get; set; } 
    } 
    public class Attributes 
    { 
     public string version { get; set; } 
     public string deviceCount { get; set; } 
    } 

    public class Attributes2 
    { 
     public string serial { get; set; } 
     public string imei { get; set; } 
     public string isLocked { get; set; } 
     public string isLost { get; set; } 
    } 
} 

lecture JSON:

string responseText = string.Empty; 
AppleAPI appobj = new AppleAPI(); 
responseText = appobj.VerifyAppleESN(newEsn); 
var resobj = JsonConvert.DeserializeObject<AppleAPI>(responseText.Replace("@",string.Empty)); 
lblSerialNumber.Text = resobj.product_info.serialNumber; 
. 
. 
lblappliedActivationDetails.Text = resobj.ios_info.appliedActivationDetails; 
. 
. 
//getting here error below line: Object ref notset to instance of object 
lblfmiVersion.Text = resobj.fmi.invalid_nameattribute.version; 

Toute idée?

Répondre

1

Si vous obtenez Object Reference not set to an instance of object., cela signifie que vous essayez d'accéder aux propriétés d'un objet null. Puisque vous avez dit qu'il se passe sur cette ligne:

lblfmiVersion.Text = resobj.fmi.invalid_nameattribute.version; 

qui pourrait signifier que l'un des resobj, resobj.fmi ou resobj.fmi.invalid_nameattribute sont nuls. En ignorant le fait que vous devriez avoir des vérifications nuls correctes dans votre code pour éviter cette situation, posons la question, pourquoi l'un de ces objets serait-il nul si la désérialisation réussissait? Peut-être qu'une partie des données n'était pas correctement désérialisée après tout. Lors de la désérialisation à l'aide de Json.Net, il est important de savoir que si des membres d'une classe n'ont pas de propriétés correspondantes dans le JSON, ces membres seront ignorés par Json.Net et conserveront ainsi leurs valeurs par défaut, par ex. null. Donc, une des raisons possibles pour laquelle vous avez une valeur nulle est que le nom d'une propriété dans votre classe ne correspond pas à ce qui est dans le JSON. Si nous jetons un coup d'oeil à votre classe Fmi, une chose qui saute tout de suite est qu'il a une propriété nommée suspicieusement appelée invalid_nameattribute. Dans le JSON, il n'y a pas de telle propriété. Au lieu de cela, il existe une propriété appelée @attributes. Votre classe FmipLockStatusDevice a le même problème. Comme ils ne correspondent pas, ces propriétés n'ont pas été remplies lors de la désérialisation, elles sont donc nulles.

Alors, comment pouvons-nous résoudre ce problème?

C'est assez simple: ajoutez un attribut [JsonProperty] à vos propriétés de classe pour les mapper aux bonnes propriétés JSON. (Pendant que vous y êtes, vous pouvez également envisager de changer les noms de ces propriétés dans votre classe C# à quelque chose qui fait réellement sens, comme « attributs ».)

public class Fmi 
{ 
    [JsonProperty("@attributes")] 
    public Attributes invalid_nameattribute { get; set; } 
    public FmipLockStatusDevice fmipLockStatusDevice { get; set; } 
} 

public class FmipLockStatusDevice 
{ 
    [JsonProperty("@attributes")] 
    public Attributes2 invalid_nameattribute2 { get; set; } 
} 

OK, maintenant que vous avez une solution , vous devriez vous demander, comment êtes-vous entré dans cette situation en premier lieu, et comment pouvez-vous l'éviter à l'avenir?

Vous avez dit que vous avez utilisé json2csharp.com pour générer vos cours. Vous devez être conscient que cet outil n'est pas infaillible et ne sera pas toujours capable de générer des classes correctes pour fonctionner avec votre JSON.Cela est vrai chaque fois que les noms de propriété JSON contiennent des caractères de ponctuation ou des espaces ou commencent par des nombres, car ceux-ci ne peuvent pas être transformés en noms de propriété C# valides. Dans ces cas, json2csharp.com générera un nom de propriété commençant par "invalide". Vous devez les rechercher et apporter des modifications manuelles à vos classes pour résoudre les problèmes. N'utilisez pas aveuglément les classes générées et supposez qu'elles sont correctes.

Espérons que cela aide.

+0

hey @Brian Rogers! Tu es vraiment génial! Vous êtes la seule personne qui m'a fait connaître la source de l'erreur! Et avec une telle Explication en détail avec la solution! Simplement génial! Merci de m'avoir indiqué "NE PAS UTILISER COMME C'EST l'utitlity" et je suis d'accord le dit! Cela a fonctionné au premier essai! Merci +1 :) –

+0

@SHEKHARSHETE Pas de problème; heureux d'avoir pu aider. –

Questions connexes