JSON (десериализованный) отправляет нулевые значения в список

#c# #json #list #null #converters

#c# #json #Список #null #преобразователи

Вопрос:

Во-первых, спасибо, что нашли время взглянуть на это. Это довольно много. Вопрос: Я в основном пытаюсь загрузить 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. Я загружаю JSON, используя пустую строку с именем o365IP

 o365IP = wc.DownloadString(wc.BaseAddress   "/endpoints/Worldwide?clientRequestId=b10c5ed1-bad1-445f-b386-b919946339a7");
  
  1. Я десериализую использование моего списка в отдельный var
 var o365IpVerion = JsonConvert.DeserializeObject<List<ConvertJsonIP>>(o365IP);
  

Этот код не показывает ошибок. поэтому я могу только предположить, что это логично с моей стороны. Следует отметить, что мне пришлось поставить

Серьезно, я застрял на этом в течение 3 дней, поэтому буду признателен за любую помощь в этом! Заранее спасибо!

Комментарии:

1. Если кто-то не сможет перейти по ссылке, я опубликую весь JSON. Просто не хотел ослеплять кого-либо, просматривающего около 600 строк JSON .. Также, если кто-нибудь знает способ использовать только часть JSON, например, в моем случае мне нужны только значения для id: 1, включая URL и ip, я буду очень признателен

2. Как называется класс под номером 1.

3. @Jawad Извините, должно быть, пропустил это .. Имя ‘GetSetJsonIP’

4. @Jawad и имя для класса 2 — ‘ConvertJsonIP’

Ответ №1:

json, который у вас есть, представляет собой список объектов, и каждый из этих объектов соответствует GetSetJsonIp . Вы должны десериализовать с помощью List<GetSetJsonIP>

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

Комментарии:

1. БОЛЬШОЕ вам спасибо! честно говоря, я не могу сказать этого достаточно. 3 дня я застрял на этом, и все это время это было так! Еще раз, спасибо. Я думаю, что это та вещь, когда вы смотрите на код так много, что ваш мозг просто немеет к нему

Ответ №2:

public class GetJsonIP работает нормально.

Причина, по которой вы должны Deserialize ввести a 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
  

Комментарии:

1. Привет. Я должен сказать, что я никогда даже не думал делать это. В настоящее время я изменяю свой код, потому что это в 10 раз снизило мою эффективность. Большое вам спасибо! Я сейчас стажер, поэтому новичок в stack overflow, иначе я бы проголосовал за это!

2. Спасибо, но вы имеете в виду, что этот код, который я опубликовал, «снизил эффективность в 10 раз»? ` Что именно снижает эффективность?