Преобразовать список<ExpandoObject> в список<KeyValuePair>

В настоящее время я работаю над приложением.NET Framework 4.7.2. Из ответа веб-службы мне нужно проанализировать данные JSON в List<KeyValuePair<int, Dictionary<string, object>>>, Этот тип данных важен для дальнейшего выполнения программы, я не могу его изменить.

Данные JSON с динамическими свойствами выглядят так:

{ "data" : [
   {"Id":1, Text:"Test1", coolProp: 213 },
   {"Id":2, Text:"Test2"},
   {"Id":3, Text:"Test3", otherProp: "cool" },
]}

Я попробовал следующую кодировку, но она не сработала:

JsonConvert.DeserializeObject<List<KeyValuePair<int, Dictionary<string, object>>>>(Convert.ToString(JObject.Parse(json)["data"]));

С другой стороны, я могу преобразовать JSON в ExpandoObject:

var expando = JsonConvert.DeserializeObject<List<ExpandoObject>>(Convert.ToString(JObject.Parse(json)["data"]));

Я думал о написании частного метода для преобразования ExpandoObject в мой List<KeyValuePair<int, Dictionary<string, object>>>,

private KeyValuePair<float, List<KeyValuePair<int, Dictionary<string, object>>>> ConvertExpandoToKeyValue(float key, List<ExpandoObject> expando)
{
    var result = new KeyValuePair<float, List<KeyValuePair<int, Dictionary<string, object>>>>();

    // I don't really know how to convert the expando object to the desired data structure
    // Moreover I need to put a float key in the structure: 52.2343

    return result;
}

ExpandoObject выглядит так:

Конечный результат KeyValuePair<float, List<KeyValuePair<int, Dictionary<string, object>>>> должно выглядеть так:

Знаете ли вы, как преобразовать ExpandoObject в нужный тип данных и добавить ключ в начале?

Или, может быть, вы знаете лучший способ преобразовать данные JSON в желаемую структуру данных?

Большое спасибо!!

1 ответ

Хорошо, я написал решение, я просто хотел поделиться с вами. Возможно, есть лучший способ, хотя:

private KeyValuePair<float, List<KeyValuePair<int, Dictionary<string, object>>>> ConvertExpandoToKeyValue(float key, List<ExpandoObject> expando)
{
    var result = new KeyValuePair<float, List<KeyValuePair<int, Dictionary<string, object>>>>
        (key, new List<KeyValuePair<int, Dictionary<string, object>>>());

    for (int i = 0; i < expando.Count; i++)
    {
        var element = new Dictionary<string, object>(expando[i]);

        var propertyValues = new KeyValuePair<int, Dictionary<string, object>>(i, element);

        result.Value.Add(propertyValues);
    }

    return result;
}
Другие вопросы по тегам