读取特定的JSON字符串时对象引用错误? [英] Object reference error while reading specific JSON string?

查看:63
本文介绍了读取特定的JSON字符串时对象引用错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用了 JSON到C#类转换器,它生成了以下类:

I have used JSON to C# Class Converter and it generates the following Class:

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":""}}}

从JSON上方读取所有数据,但only the line at which i get error is in reading the JSON is:

From Above JSON all the data is read but 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"}}},

错误:

对象引用未设置为对象的实例.

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

读取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;

有什么想法吗?

推荐答案

如果获取Object Reference not set to an instance of object.,则意味着您正在尝试访问null对象上的属性.因为您说过的话是在这条线上发生的:

If you're getting Object Reference not set to an instance of object. that means that you're trying to access properties on an object that is null. Since you said it happens on this line:

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

可能意味着resobjresobj.fmiresobj.fmi.invalid_nameattribute中的任何一个都为空.忽略在代码中应该进行适当的null检查以帮助避免这种情况的事实,让我们问一个问题,如果反序列化成功,为什么这些对象中的任何一个都为null?毕竟,某些数据可能未正确反序列化.

that could mean that any of resobj, resobj.fmi, or resobj.fmi.invalid_nameattribute are null. Ignoring the fact that you should have proper null checks in your code to help avoid this situation, let's ask the question, why would any of these objects be null if deserialization succeeded? Perhaps some of the data was not deserialized correctly after all.

使用Json.Net反序列化时,重要的是要知道,如果类的任何成员在JSON中不具有匹配的属性,则Json.Net将跳过这些成员,从而保留其默认值,例如null.因此,您可能为null的一个可能原因是类中的属性名称与JSON中的属性名称不匹配.

When deserializing using Json.Net, it is important to know that if any members of a class do not have matching properties in the JSON, those members will be skipped by Json.Net and thus retain their default values, e.g. null. So one possible reason that you have a null is that the name of a property in your class does not match what is in the JSON.

如果我们看一下您的Fmi类,马上就会跳出来的一件事是它具有一个名为invalid_nameattribute的可疑名称的属性.在JSON中,没有这样的属性.而是有一个名为@attributes的属性.您的FmipLockStatusDevice类具有相同的问题.由于它们不匹配,因此在反序列化期间不会填充这些属性,因此它们为空.

If we take a look at your Fmi class, one thing that jumps out right away is that it has a suspiciously named property called invalid_nameattribute. In the JSON, there is no such property. Instead, there is a property called @attributes. Your FmipLockStatusDevice class has the same problem. Since they didn't match up, these properties did not get populated during deserialization, so they are null.

那么我们该如何解决呢?

So how can we fix this?

这很简单:在类属性中添加一个[JsonProperty]属性,以将它们映射到正确的JSON属性. (在进行此操作时,您可能还会考虑将C#类中那些属性的名称更改为实际上有意义的名称,例如属性".)

This is simple enough: add a [JsonProperty] attribute to your class properties to map them to the right JSON properties. (While you're at it, you might also consider changing the names of those properties in your C# class to something that actually makes sense, like "Attributes".)

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, now that you have a solution, you should ask yourself, how did you get into this situation in the first place, and how can you avoid it in the future?

您说过您使用 json2csharp.com 来生成类.您需要注意,此工具并非万无一失,并且将无法始终生成正确的类来与JSON配合使用.每当JSON属性名称包含标点符号或空格或以数字开头时,都是如此,因为它们不能转换为有效的C#属性名称.在这些情况下,json2csharp.com将生成以"invalid"开头的属性名称.您需要查找这些内容,然后对您的班级进行手动调整以解决问题.不要只是盲目使用生成的类并假设它们是正确的.

You said you used json2csharp.com to generate your classes. You need to be aware that this tool is not foolproof, and will not always be able to generate correct classes to work with your JSON. This is true whenever the JSON property names contain punctuation characters or spaces or start with numbers, because these cannot be turned into valid C# property names. In these cases, json2csharp.com will generate a property name that starts with "invalid". You need to look for these, and make manual adjustments to your classes to fix the issues. Do not just blindly use the generated classes and assume they are correct.

希望这会有所帮助.

这篇关于读取特定的JSON字符串时对象引用错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆