读取特定JSON字符串时对象引用错误?我使用了JSON到C#类转换器,它生成以下类: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":"美国AT&T波多黎各和美属维尔京群岛激活政策","appliedActivationPolicyID":"23","appliedActivationDetails":"美国AT&T波多黎各和美属维尔京群岛激活政策"激活策略","nextTetherPolicyID":"23","nextTetherPolicyDetails":"美国AT&T波多黎各和美属维尔京群岛激活策略","macAddress":"ACFDEC6C988A","bluetoothMacAddress":"AC:FD:EC:6C:98:8B","partDescription":"IPHONE5S太空灰64GB-美国"},"fmi":{"@attributes":{"version":"1","deviceCount":"1"},"fmipLockStatusDevice":{"@attributes":{"序列号":"F2LLMBNJFFFQ","imei":"013884004132355","isLocked":"true","isLost":"false"}}},"product_info":{"serialNumber":"F2LLMBNJFFF","warrantyStatus":"Apple有限保修","coverageEndDate":"11/25/14","coverageStartDate":"11/26/13","daysRemaining":"497","estimatedPurchaseDate":"11/26/13","purchaseCountry":"UnitedStates","re??gistrationDate":“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":"iPhone5S","configDescription":"IPHONE5S灰色64GBGSM","slaGroupDescription":"","contractCoverageEndDate":"11/25/15","contractCoverageStartDate":"11/26/13","contractType":"C1","laborCovered":"Y""limitedWarranty":"Y","partCovered":"Y","notes":"AppleCare+涵盖-可用事件","acPlusFlag":"Y","consumerLawInfo":{"serviceType":"","popMandatory":"","allowedPartType":""}}}从JSON以上读取获取所有数据,但只有我得到的行读取JSON时出错是:fmi":{"@attributes":{"version":"1","deviceCount":"1"},"fmipLockStatusDevice":{"@attributes":{"serial":“F2LLMBNJFFFQ”,“imei”:“013884004132355”,“isLocked”:“true”,“isLost”:“false”}}},错误:未将对象引用设置为对象的实例公共类AppleAPI{publicIosInfoios_info{get;放;}publicProductInfoproduct_info{得到;放;}publicFmifmi{get;放;}publicclassIosInfo{publicstringserialNumber{get;放;}publicstringimeiNumber{get;放;}publicstringmeid{get;放;}publicstringiccID{get;放;}publicstringfirstUnbrickDate{get;放;}publicstringlastUnbrickDate{get;放;}publicstringunbricked{get;放;}公共字符串解锁{get;放;}publicstringproductVersion{得到;放;}publicstringinitialActivationPolicyID{get;放;}publicstringinitialActivationPolicyDetails{get;放;}publicstringappliedActivationPolicyID{get;放;}publicstringappliedActivationDetails{get;放;}publicstringnextTetherPolicyID{get;放;}publicstringnextTetherPolicyDetails{get;放;}publicstringmacAddress{得到;放;}publicstringbluetoothMacAddress{get;放;}publicstringpartDescription{get;秒等;}}publicclassConsumerLawInfo{publicstringserviceType{get;放;}publicstringpopMandatory{get;放;}publicstringallowedPartType{get;放;}}publicclassProductInfo{publicstringserialNumber{get;放;}publicstringwarrantyStatus{get;放;}publicstringcoverageEndDate{get;放;}publicstringcoverageStartDate{get;放;}publicstringdaysRemaining{get;放;}publicstringestimatedPurchaseDate{get;放;}publicstringpurchaseCountry{get;放;}publicstringregistrationDate{get;放;}publicstringimageURL{get;放;}publicstringexplodedViewURL{get;放;}publicstringmanualURL{get;放;}publicstringproductDescription{得到;放;}publicstringconfigDescription{get;放;}公共字符串slaGroupDescription{得到;放;}publicstringcontractCoverageEndDate{get;放;}publicstringcontractCoverageStartDate{get;放;}publicstringcontractType{get;放;}公开cstringlaborCovered{get;放;}publicstringlimitedWarranty{get;放;}publicstringpartCovered{get;放;}公共字符串注释{get;放;}公共字符串acPlusFlag{得到;放;}publicConsumerLawInfoconsumerLawInfo{get;放;}}publicclassFmi{公共属性invalid_nameattribute{get;放;}publicFmipLockStatusDevicefmipLockStatusDevice{get;放;}}publicclassFmipLockStatusDevice{publicAttributes2invalid_nameattribute2{get;放;}}公共类属性{公共字符串版本{get;放;}publicstringdeviceCount{得到;放;}}publicclassAttributes2{publicstringserial{get;放;}publicstringimei{get;放;}publicstringisLocked{get;放;}publicstringisLost{得到;放;}}}阅读JSON:stringresponseText=string.Empty;AppleAPIappobj=newAppleAPI();responseText=appobj.VerifyAppleESN(newEsn);varresobj=JsonConvert.DeserializeObject(responseText.Replace("@",string.Emp泰));lblSerialNumber.Text=resobj.product_info.serialNumber;..lblappliedActivationDetails.Text=resobj.ios_info.appliedActivationDetails;..//在下面一行出现错误:ObjectrefnotsettoinstanceofobjectlblfmiVersion.Text=resobj..invalid_nameattribute.version;有任何想法吗?如果您的对象引用未设置为对象的实例。这意味着您正在尝试访问该对象的一个??null属性因为您说它发生在这一行:lblfmiVersion.Text=resobj.fmi.invalid_nameattribute.version;这可能意味着resobj,resobj.fmi或resobj.fmi.invalid_nameattribute为空。忽略您应该在代码中进行适当的空值检查以帮助避免这种情况这一事实,让我们问一个问题,如果反序列化成功,为什么这些对象中的任何一个都是空值?也许有些数据毕竟没有正确反序列化。当使用Json.Net反序列化时,重要的是要知道如果一个类的任何成员在JSON中没有匹配的属性,那么Json.Net将跳过这些成员,将它们保留为默认值,例如null。所以你有一个null的一个可能原因是你的类中的属性名称与JSON中的属性名称不匹配。如果我们查看您的Fmi类,会立即跳出的一件事是它有一个名为invalid_nameattribute的可疑命名属性。在JSON中,没有这样的属性。相反,有一个名为@attributes的属性。您的FmipLockStatusDevice类有同样的问题。由于它们不匹配,反序列化期间不会填充这些属性,因此它们是空的。那么我们如何解决这个问题呢?很简单:将[JsonProperty]属性添加到您的类属性以将它们映射到正确的JSON属性。(当你这样做时,你可能还会考虑将C#类中的这些属性的名称更改为真正有意义的名称,例如“属性”。)得到;放;}publicFmipLockStatusDevicefmipLockStatusDevice{get;放;}}publicclassFmipLockStatusDevice{[JsonProperty("@attributes")]publicAttributes2invalid_nameattribute2{get;解决方案,你应该问问自己,你最初是如何陷入这种情况的,以后又如何避免呢?你说你使用json2csharp.com来生成你的类。你需要知道这个工具不是万无一失的,它不会总是生成正确的类来使用你的JSON。只要JSON属性名称包含标点符号或空格或以数字开头,就是如此,因为这些无法转换为有效的C#属性名称。在这些情况下,json2csharp.com将生成以“invalid”开头的属性名称。您需要找到这些并对类进行手动调整以解决问题。不要盲目地使用生成的类并假设它们是正确的。希望这可以帮助。以上就是C#学习教程:读取特定JSON字符串时对象引用错误?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
