Сравнение значений из десериализованного Json объекта - PullRequest
0 голосов
/ 01 августа 2020

У меня есть API, который собирает похожую информацию из разных источников. Что мне нужно сделать, так это сравнить эти источники и сохранить в переменной тот, который имеет самый высокий уровень достоверности. Я могу придумать несколько длинных способов, чтобы, возможно, выполнить sh это, создать несколько массивов или списков и перебирать каждый из них, пока не останется наивысшее значение, но мне интересно, есть ли более простой способ сделать это используя что-то linq.

{
  "modeled_response": [
    {
      "source": "arturo_bulk_import",
      "attributes": {
        "roof_shape": {
          "value": "Gable",
          "confidence": 0.9522576226679909
        },
        "roof_slope": {
          "value": "Low",
          "confidence": 0.8674100762576565
        }
    }
    },
    {
      "source": "region_state_arturo_bulk_import",
      "attributes": {
        "roof_shape": {
          "value": "Gable",
          "confidence": 0.8467693167596497
        },
        "roof_slope": {
          "value": "Low",
          "confidence": 0.8515481815500642
        }
}
    },
    {
      "source": "region_zipcode5_arturo_bulk_import",
      "attributes": {
        "roof_shape": {
          "value": "Gable",
          "confidence": 0.8353433674418161
        },
        "roof_slope": {
          "value": "Low",
          "confidence": 0.868985703016765
        }
      }
    }
  ],
}

А затем я десериализую объект и сохраняю его в списке результатов. Не уверен, где go отсюда получить значение с наибольшим уровнем достоверности

    class Program
    {
        static void Main(string[] args)
        {

            const string FILE_PATH = @"";

            StreamReader r = new StreamReader(FILE_PATH);
            string json = r.ReadToEnd();
            RootObject deserializedProduct = 
                JsonConvert.DeserializeObject
                    <RootObject>(json);

            List<RoofShape> resultsList = new List<RoofShape>();
            int index = 0;
            do
            {
                resultsList.Add(new RoofShape
                {
                    confidence = deserializedProduct.modeled_response[index]
                    .attributes.roof_shape.confidence,
                    value = deserializedProduct.modeled_response[index]
                    .attributes.roof_shape.value
                });
                index++;
            } while (deserializedProduct.modeled_response.Count > index);
        }
    }

    public class RootObject
    {
        public string normalized_address { get; set; }
        public string created_timestamp { get; set; }
        public List<ModeledResponse> modeled_response { get; set; } 
    }

    public class ModeledResponse
    {
        public string source { get; set; }
        public Attributes attributes { get; set; }
        
    }

    public class Attributes
    {
        public string attributes { get; set; }
        public RoofShape roof_shape { get; set; }
    }

    public class RoofShape
    {
        public string value { get; set; }
        public decimal confidence { get; set; }
    }

1 Ответ

1 голос
/ 01 августа 2020

Следующий код генерирует переменную ModeledResponse с наивысшим уровнем достоверности с использованием Linq.

RootObject deserializedProduct = JsonConvert.DeserializeObject<RootObject>(json);
decimal maxConfidenceInAllModels = deserializedProduct.modeled_response.Max(x => x.attributes.roof_shape.confidence);
ModeledResponse confident = deserializedProduct.modeled_response
                            .Where(x => x.attributes.roof_shape.confidence == maxConfidenceInAllModels)
                            .FirstOrDefault();

Используя метод Max, вы можете узнать, каков наивысший уровень достоверности .., а затем использовать этот номер для фильтрации списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...