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