Разрешить несколько значений для одного и того же ключа при создании JSON с использованием ExpandoObject и IDictionary - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь создать динамический JSON с использованием ExpandoObject и IDictionary.

Во время динамического создания JSON могут быть случаи, когда имя или значение будут повторяться.Однако при добавлении повторяемого имени или значения в ExpandoObject выдается ошибка:

Элемент с тем же ключом уже добавлен.

Ниже приведен мой кодфрагмент:

DataTable dt_MappedColumns = (DataTable)ViewState["MappedColumns"];
dynamic ManCols = new ExpandoObject();
var dictionary1 = (IDictionary<string, object>)ManCols;
foreach (DataRow dr in dt_MappedColumns.Rows)
{
     dictionary1.Add(dr["TColumnName"].ToString(), dr["AColumnName"].ToString());
}
string Manjson = Newtonsoft.Json.JsonConvert.SerializeObject(dictionary1);

DataTable выглядит следующим образом:

Sr.No TColumnName AColumnName
----- ----------- -----------
1     Apple       Lion
2     Orange      Tiger
3     Mango       Fox
4     Orange      Wolf

В приведенной выше таблице первые 3 строки успешно добавлены в dictionary1;однако, когда мы пытаемся добавить четвертую строку, она выдает ошибку.

Моя желаемая структура JSON для повторяющихся значений будет выглядеть следующим образом:

{"Apple": "Lion"," Orange ": [" Tiger "," Wolf "]," Mango ":" Fox "}

Возможно ли создать эту структуру JSON из таблицы?

1 Ответ

0 голосов
/ 06 декабря 2018

Конечно, это возможно.Внутри вашего цикла вам просто нужно проверить, существует ли ключ в словаре и предпринять соответствующие действия.Существует три случая:

  • Ключ не существует, поэтому добавьте его, как вы делаете сейчас.
  • Ключ существует, и существующее значение является строкой, в этом случаевам нужно заменить его списком, содержащим старое строковое значение и новое строковое значение.
  • Ключ существует, а существующее значение представляет собой список, и в этом случае вам просто нужно добавить новую строку в список.

Вот как выглядит код:

foreach (DataRow dr in dt_MappedColumns.Rows)
{
    string key = dr["TColumnName"].ToString();
    string value = dr["AColumnName"].ToString();

    if (!dictionary1.ContainsKey(key))
    {
        // key does not already exist, so add it
        dictionary1.Add(key, value);
    }
    else
    {
        // key exists, get the existing value
        object existingValue = dictionary1[key];

        if (existingValue is string)
        {
            // replace the existing string value with a list
            dictionary1[key] = new List<string> { (string)existingValue, value }; 
        }
        else
        {
            // the existing value is a list, so add the new value to it
            ((List<string>)existingValue).Add(value);
        }
    }
}

Fiddle: https://dotnetfiddle.net/PERc0D

...