C# 在尝试检索json数据时,对象引用未设置为对象的实例

C# 在尝试检索json数据时,对象引用未设置为对象的实例,c#,json,C#,Json,我正在尝试从以下url获取数据 我曾经提取过这些类,但我就是无法获取我要的数据 有谁比我更有经验,请看一看,让我知道我哪里做错了 这是抛出空引用的代码 var data = (from j in o["countries"].Children() select new Country { Id = (string)j["id"]

我正在尝试从以下url获取数据

我曾经提取过这些类,但我就是无法获取我要的数据

有谁比我更有经验,请看一看,让我知道我哪里做错了

这是抛出空引用的代码

var data = (from j in o["countries"].Children()
                        select new Country
                        {
                                Id      = (string)j["id"],
                                WebUrl  = (string)j["name"]
                        });
完整代码

namespace Web.Domain.FCO.Countries
{
    public class Details
    {
        public string Description { get; set; }
        public object ShortDescription { get; set; }
        public string Type { get; set; }
    }

    public class ContentWithTag
    {
        public string Id { get; set; }
        public string WebUrl { get; set; }
    }

    public class Details2
    {
        public string Description { get; set; }
        public object ShortDescription { get; set; }
        public string Type { get; set; }
    }

    public class ContentWithTag2
    {
        public string Id { get; set; }
        public string WebUrl { get; set; }
    }

    public class Parent
    {
        public string Id { get; set; }
        public object WebUrl { get; set; }
        public string Title { get; set; }
        public Details2 Details { get; set; }
        public ContentWithTag2 ContentWithTag { get; set; }
        public object parent { get; set; }
    }

    public class Tag
    {
        public string Id { get; set; }
        public object WebUrl { get; set; }
        public string Title { get; set; }
        public Details Details { get; set; }
        public ContentWithTag ContentWithTag { get; set; }
        public Parent Parent { get; set; }
    }

    public class Related
    {
        public string Id { get; set; }
        public string WebUrl { get; set; }
        public string Title { get; set; }
        public string Format { get; set; }
        public string UpdatedAt { get; set; }
        public string Group { get; set; }
    }

    public class Country
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Identifier { get; set; }
        public string WebUrl { get; set; }
        public string UpdatedAt { get; set; }
        public string ChangeDescription { get; set; }
        public List<object> Synonyms { get; set; }
    }

    public class Details3
    {
        public string NeedId { get; set; }
        public bool BusinessProposition { get; set; }
        public string Description { get; set; }
        public string Language { get; set; }
        public bool NeedExtendedFont { get; set; }
        public List<Country> Countries { get; set; }
    }

    public class ResponseInfo
    {
        public string Status { get; set; }
    }

    public class FcoFullDetails
    {
        public string Id { get; set; }
        public string WebUrl { get; set; }
        public string Title { get; set; }
        public string Format { get; set; }
        public string UpdatedAt { get; set; }
        public List<Tag> Tags { get; set; }
        public List<Related> Related { get; set; }
        public Details3 Details { get; set; }
        public List<object> RelatedExternalLinks { get; set; }
        public ResponseInfo ResponseInfo { get; set; }
    }

    public class IdAndUrl
    {
        public string Id { get; set; }
        public string WebUrl { get; set; } 
    }

    public class DisplayFcoCountryList : IDisplayFcoCountryList
    {
        public IEnumerable<Country> ListOfCountries()
        {
            var doc = FcoCountriesAdvice.GetFcoCountryLinks().Result;
           // var jd = new [] {JsonConvert.DeserializeObject(doc)};
            var jd = JsonConvert.DeserializeObject(doc);
            JObject o = JObject.Parse(jd.ToString());

            //var data = (from j in o["countries"]
                        var data = (from j in o["countries"].Children()
                        select new Country
                        {
                                Id      = (string)j["id"],
                                WebUrl  = (string)j["name"]
                        });
            return data;
        }
    }
    public static class FcoCountriesAdvice
    {
        private static readonly string Key = ConfigurationManager.AppSettings["FCO_AdviceURL"];

        public static async Task<string> GetFcoCountryLinks()
        {
            using (var ta = new HttpClient())
            {
                const string cacheDataTravelAdvice = "FCOCountryLinks";

                ObjectCache travelCache = MemoryCache.Default;
                var objectInCache = travelCache.Get(cacheDataTravelAdvice) as string;

                if (objectInCache != null)
                {
                    return objectInCache;
                }

                var url = await ta.GetStringAsync(string.Format("{0}", Key)).ConfigureAwait(false);

                var policy = new CacheItemPolicy { AbsoluteExpiration = DateTime.Now.AddMinutes(15) };

                travelCache.Add(cacheDataTravelAdvice, url, policy);

                return url;
            }
        }
    }
}
namespace Web.Domain.FCO.Countries
{
公开课详情
{
公共字符串说明{get;set;}
公共对象ShortDescription{get;set;}
公共字符串类型{get;set;}
}
公共类ContentWithTag
{
公共字符串Id{get;set;}
公共字符串WebUrl{get;set;}
}
公共类详细信息2
{
公共字符串说明{get;set;}
公共对象ShortDescription{get;set;}
公共字符串类型{get;set;}
}
Tag2的公共类内容
{
公共字符串Id{get;set;}
公共字符串WebUrl{get;set;}
}
公共类父类
{
公共字符串Id{get;set;}
公共对象WebUrl{get;set;}
公共字符串标题{get;set;}
公共详细信息2详细信息{get;set;}
public ContentWithTag2 ContentWithTag{get;set;}
公共对象父对象{get;set;}
}
公共类标签
{
公共字符串Id{get;set;}
公共对象WebUrl{get;set;}
公共字符串标题{get;set;}
公共详细信息{get;set;}
public ContentWithTag ContentWithTag{get;set;}
公共父级{get;set;}
}
公共类相关
{
公共字符串Id{get;set;}
公共字符串WebUrl{get;set;}
公共字符串标题{get;set;}
公共字符串格式{get;set;}
公共字符串UpdatedAt{get;set;}
公共字符串组{get;set;}
}
公营国家
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共字符串标识符{get;set;}
公共字符串WebUrl{get;set;}
公共字符串UpdatedAt{get;set;}
公共字符串changescription{get;set;}
公共列表同义词{get;set;}
}
公开课程详情3
{
公共字符串NeedId{get;set;}
公共布尔业务命题{get;set;}
公共字符串说明{get;set;}
公共字符串语言{get;set;}
公共bool需要扩展字体{get;set;}
公共列表国家{get;set;}
}
公共类响应信息
{
公共字符串状态{get;set;}
}
公共类FcoFullDetails
{
公共字符串Id{get;set;}
公共字符串WebUrl{get;set;}
公共字符串标题{get;set;}
公共字符串格式{get;set;}
公共字符串UpdatedAt{get;set;}
公共列表标记{get;set;}
与公共列表相关的{get;set;}
公共详细信息3详细信息{get;set;}
公共列表相关外部链接{get;set;}
公共响应信息响应信息{get;set;}
}
公共类IdAndUrl
{
公共字符串Id{get;set;}
公共字符串WebUrl{get;set;}
}
公共类DisplayFcoCountryList:IDisplayFcoCountryList
{
公共IEnumerable国家列表()
{
var doc=fcocontriesadvice.getfcocontrylinks().Result;
//var jd=new[]{JsonConvert.DeserializeObject(doc)};
var jd=JsonConvert.DeserializeObject(doc);
JObject o=JObject.Parse(jd.ToString());
//var数据=(来自o[“国家”]
var数据=(来自o[“国家”]中的j.Children()
选择新国家/地区
{
Id=(字符串)j[“Id”],
WebUrl=(字符串)j[“名称”]
});
返回数据;
}
}
公共静态类FcoCountriesAdvice
{
私有静态只读字符串键=ConfigurationManager.AppSettings[“FCO_AdviceURL”];
公共静态异步任务GetFCoCountryLink()
{
使用(var ta=new HttpClient())
{
const string cacheDataTravelAdvice=“fcocontrylinks”;
ObjectCache travelCache=MemoryCache.Default;
var objectInCache=travelCache.Get(cacheDataTravelAdvice)作为字符串;
if(objectInCache!=null)
{
返回objectInCache;
}
var url=await ta.GetStringAsync(string.Format(“{0}”,Key)).ConfigureAwait(false);
var policy=newcacheitempolicy{AbsoluteExpiration=DateTime.Now.AddMinutes(15)};
Add(cacheDataTravelAdvice、url、policy);
返回url;
}
}
}
}

创建linq语句时出现nullref异常很可能意味着:
o[“countries”].Children()
返回NULL,因此无法对其进行迭代。如果使用一些简单的语句对其进行调试,请尝试以下操作:

Console.WriteLine(o[“国家])

Console.WriteLine(o[“国家].Children())

Console.WriteLine(o[“countries”].Children().Count())


尝试使用类似的json反序列化程序。这将为您完成所有json-c#转换:

    //make request using the HttpClient class
    var client = new HttpClient{BaseAddress = new Uri("https://www.gov.uk/api/")};
    var response = client.GetAsync("foreign-travel-advice.json").Result;

    //use Json.Net to convert json to c# classes using generics
    var content = JsonConvert.DeserializeObject<RootObject>    (response.Content.ReadAsStringAsync().Result);
//使用HttpClient类发出请求
var client=new-HttpClient{BaseAddress=new-Uri(“https://www.gov.uk/api/")};
var response=client.GetAsync(“foreign travel advice.json”).Result;
//使用Json.Net使用泛型将Json转换为c#类
var content=JsonConvert.DeserializeObject(response.content.ReadAsStringAsync().Result);

Alessio answer修复了问题,在访问他提供的链接后,我注意到我