Преобразовать список <ExpandoObject>в список <KeyValuePair> - PullRequest
0 голосов
/ 22 октября 2018

В настоящее время я работаю над приложением .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" },
]}

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

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 выглядит следующим образом:

enter image description here

Окончательный результат KeyValuePair<float, List<KeyValuePair<int, Dictionary<string, object>>>> должен выглядеть следующим образом:

enter image description here

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

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

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

1 Ответ

0 голосов
/ 22 октября 2018

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

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;
}
...