【问题标题】:JSON (deserialized) sends null values to listJSON(反序列化)将空值发送到列表
【发布时间】:2020-08-25 22:58:08
【问题描述】:

首先感谢您花时间看这个。这是相当多的。 问题: 我基本上是在尝试将 json 作为字符串下载,然后将其反序列化为列表。原因是我可以调用该列表的特定属性(在我的情况下为“ips”,因为它是我真正需要的)并在满足要求时将其插入表中。 问题在于它将所有空值移动到数组中。 114 列 null 或空数组,我不知道为什么? 我想我会附上一个指向 JSON 的链接,因为它是一个巨大的文件,它在这里 https://endpoints.office.com/endpoints/Worldwide?clientRequestId=b10c5ed1-bad1-445f-b386-b919946339a7

这是我的代码:

  1. 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; }
       }
    
    
  2. 列表类
    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");
  1. 我使用我的 List 反序列化到一个单独的 var
var o365IpVerion = JsonConvert.DeserializeObject<List<ConvertJsonIP>>(o365IP);

此代码没有显示错误。所以我只能假设它对我来说是合乎逻辑的。应该注意的是,我必须将

说真的,我已经坚持了 3 天,因此我们将不胜感激任何帮助!提前致谢!

【问题讨论】:

  • 如果有人无法访问链接,我将发布整个 JSON。只是不想让任何经历大约 600 行 JSON 的人蒙蔽。另外,如果有人知道一种只获取 JSON 一部分的方法,例如就我而言,我只想要 id: 1 的值,包括 url 和 ip,我会非常棒的
  • 1 号的班级名称是什么。
  • @Jawad 抱歉一定错过了.. 名字是'GetSetJsonIP'
  • @Jawad,第 2 类的名称是 'ConvertJsonIP'

标签: c# json list null converters


【解决方案1】:

您拥有的 json 是一个对象列表,每个对象都符合 GetSetJsonIp。你应该反序列化使用List&lt;GetSetJsonIP&gt;

var o365IpVerion = JsonConvert.DeserializeObject<List<GetSetJsonIP>>(o365IP);

【讨论】:

  • 非常感谢!老实说,我说的还不够。 3天我一直坚持这个,一直都是这样!再次感谢您。我认为这就是你看代码太多你的大脑就会麻木的事情
【解决方案2】:

public class GetJsonIP 工作正常。

您必须将Deserialize 转换为List&lt;&gt; 的原因是因为json 对象以括号开头,使整个对象成为Listarray

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

【讨论】:

  • 嗨。我不得不说我从来没有想过要这样做。我目前正在更改我的代码,因为这已经将我的效率降低了 10 倍。太感谢了!我现在是一名实习生,所以对堆栈溢出很陌生,否则我会投票赞成!
  • 谢谢,但你的意思是我贴的这段代码“破坏效率10倍?”究竟什么是破坏效率?
猜你喜欢
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多