问题描述
首先,感谢您抽出宝贵的时间对此进行研究。相当多。 题: 我基本上是想下载一个json作为字符串,然后反序列化到一个列表。原因是这样,然后我可以调用该列表的特定属性(在我的情况下为“ ips”,因为这是我实际需要的所有属性),如果满足要求,可以将其插入表中。 问题在于它将所有空值移入数组。 114列的null或空数组,我不知道为什么? 我认为我会在JSON上附加一个链接,因为它的文件很大https://endpoints.office.com/endpoints/Worldwide?clientRequestId=b10c5ed1-bad1-445f-b386-b919946339a7
这是我的代码:
- JSON的字母和字母
public class GetSetJsonIP { [JsonProperty("id")] public int id { get; set; } [JsonProperty("serviceArea")] public string ServiceArea { get; set; } [JsonProperty("serviceAreadisplayName")] public string ServiceAreadisplayName { get; set; } [JsonProperty("urls")] public IList<string> urls { get; set; } [JsonProperty("ips")] public IList<string> ips { get; set; } [JsonProperty("tcpPorts")] public string tcpPorts { get; set; } [JsonProperty("expressRoute")] public bool expressRoute { get; set; } [JsonProperty("category")] public string category { get; set; } [JsonProperty("required")] public bool required { get; set; } [JsonProperty("notes")] public string notes { get; set; } [JsonProperty("udpPorts")] public string udpPorts { get; set; } }
- 列表类别
public class ConvertJsonIP{
public List<GetSetJsonIP> jsonIpConvert { get; set; }
public List<GetSetJsonIP> jsonIPConvert = new List<GetSetJsonIP>();
}
3。我使用名为o365IP的空字符串下载JSON
o365IP = wc.DownloadString(wc.BaseAddress + "/endpoints/Worldwide?clientRequestId=b10c5ed1-bad1-445f-b386-b919946339a7");
- 我将我的列表反序列化为单独的变量
var o365IpVerion = JsonConvert.DeserializeObject<List<ConvertJsonIP>>(o365IP);
此代码未显示任何错误。所以我只能假设这是合乎逻辑的。应该注意的是,我不得不放入 严重的是,我已经坚持了3天,因此对此的任何帮助将不胜感激!预先感谢!
解决方法
您拥有的json是对象列表,并且这些对象中的每一个都符合GetSetJsonIp
。您应该使用List<GetSetJsonIP>
var o365IpVerion = JsonConvert.DeserializeObject<List<GetSetJsonIP>>(o365IP);
,
public class GetJsonIP
工作正常。
您必须Deserialize
进入List<>
的原因是因为json对象以括号开头,使得整个对象成为List
或array
。
var O365IpVersion = JsonConvert.DeserializeObject<List<GetJsonIP>(O365IP);
有多种获取特定属性值的方法。如果您只需要ips
并要检查该值然后更新它,则可以循环:
JArray arr = JArray.Parse(O365IP);
foreach (JObject obj in arr.Children<JObject>())
{
foreach (JPRoperty prop in obj.Properties().Where(x => x.Name == "ips"))
{
//use prop.Value and perform tasks
}
}
或者只是简单地像这样循环:
for (int i = 0; i < O365IpVersion.Count; i++)
{
//use O365IpVersion.ElementAt(i).ips