Нахождение десериализованного значения IndexOf json в списке - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь найти IndexOf в списке, используя значение в качестве ссылки.Как, скажем, Id = 23144, я хочу индекс при вводе Id.Этот список объектов создается десериализацией Json, полученного с помощью RestSharp.

{  
   "not_modified_since":"2018-06-05T22:22:18Z",
   "host":[  
      {  
         "active":true,
         "config_profile_bag_id":0,
         "container_id":0,
         "db_pickup_tm_utc":"2018-01-11T10:12:55",
         "discovery_status":0,
         "display_unit_id":0,
         "domain_id":103947039,
         "geolocation":"(0,0)",
         "id":195392183,
         "license_end_date":null,
         "licensed":true,
         "name":"Broadsign Services - Mathias - 16x64",
         "nscreens":0,
         "primary_mac_address":"00:0c:29:e0:e6:22",
         "public_key_fingerprint":"Redacted",
         "remote_clear_db_tm_utc":"1970-01-01T00:00:00",
         "remote_reboot_tm_utc":"2017-12-12T10:17:23",
         "secondary_mac_address":"",
         "volume":-1
      }
   ]
}

У меня есть следующий код:

private void bRun_Click(object sender, EventArgs e)
{
    var client = new RestClient(endPoint);
    var request = new RestRequest("/host/v14/by_id", Method.GET);
    request.AddHeader("accept", "application/json");
    request.AddHeader("Authorization", "Bearer " + key);
    request.AddParameter("domain_id", "103947039");
    request.AddParameter("ids", "195392183");
    request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
    request.RequestFormat = DataFormat.Json;
    var response = client.Execute<RootObject>(request);
    var rootObject = JsonConvert.DeserializeObject<RootObject>(response.Content);
    var hosts = rootObject.Host;
    oResponse.Text = hosts.IndexOf();
}

Может быть несколько хостов, поэтому я бы хотел бытьсмог найти индекс каждого хоста, чтобы я мог узнать, какой из них получить значение при соблюдении определенных условий, например, тех, которые соответствуют идентификатору.В сумме я хотел бы иметь возможность узнать, что идентификатор 195392183 имеет индекс 0, чтобы я мог затем использовать этот индекс для получения значения для имени (например, Broadsign Services - Mathias - 16x64).

EDIT!РЕШИТЬ!Это сработало для меня:

var index = rootObject.Host.FindIndex(host => host.Id == 195392183);

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы можете добавить индекс к вашему десериализованному объекту, используя пользовательское покрытие.

public class ListWithIndexConverter<T> : JsonConverter where T : IIndexedObject
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(List<T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type != JTokenType.Array)
        {
            return new List<T>();
        }

        var returnList = new List<T>();
        for(var i=0; i < token.Count(); i++)
        {
            var returnObject = token[i].ToObject<T>();
            returnObject.Index = i;
            returnList.Add(returnObject);
        }
        return returnList;
    }

    public override bool CanWrite => false;

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

public interface IIndexedObject
{
    int Index { get; set; }
}

public class SomeObject
{
    [JsonConverter(typeof(ListWithIndexConverter<Host>))]
    public List<Host> Hosts { get; set; }
}

public class Host : IIndexedObject
{
     //some properties
}
0 голосов
/ 06 июня 2018

Вы можете создать словарь на основе хоста

var hostsDict = rootObject.Select(r=> r.Host).ToDictionary<int, Host>(k=> k.Id, v=> v);

return hostDict[195392183];
...