首先感谢您花时间研究此问题。这相当多。问题:我基本上是尝试将json下载为字符串,然后将其反序列化为列表。原因是,如果满足要求,我可以调用该列表的特定属性(在我的情况下是"ips",因为这是我实际需要的全部(,并将其插入到表中。问题是,它会将所有null值移动到数组中。114列的null或空数组,我不明白为什么?我想我会附上一个JSON的链接,因为它是一个巨大的文件,在这里https://endpoints.office.com/endpoints/Worldwide?clientRequestId=b10c5ed1-bad1-45f-b386-b919946339a7
这是我的代码:
- JSON的Getter和setter
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");
- 我使用List将其反序列化为一个单独的var
var o365IpVerion = JsonConvert.DeserializeObject<List<ConvertJsonIP>>(o365IP);
此代码没有显示任何错误。所以我只能假设这是一个合乎逻辑的问题。应该注意的是,我不得不把<列表<in来停止一个错误,该错误指出它无法将对象转换为数组。
说真的,我已经被困了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