使用ExpandoObject和IDictionary的创建JSON时允许多个值相同的密钥(Allo

2019-10-16 12:59发布

我试图创建一个使用ExpandoObject和IDictionary的动态JSON。

在动态创建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结构重复的值应该是这样的:

{ “苹果”: “狮子”, “橙”: “虎”, “狼”], “芒果”: “狐狸”}

是否有可能创建从表中该JSON结构?

Answer 1:

当然这是可能的。 里面你的循环,你只需要检查开关是否已经存在于词典,并采取适当的行动。 有三种情况:

  • 该键不存在,所以加它,你现在正在做的事情。
  • 关键的存在和现有的值是一个字符串,在这种情况下,你需要使用包含旧的字符串值,新的字符串值的列表来代替它。
  • 关键的存在和现有的值是一个列表,在这种情况下,你只需要将新的字符串添加到列表中。

下面是代码如下:

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

小提琴: https://dotnetfiddle.net/PERc0D



文章来源: Allow multiple values for the same key when creating JSON using ExpandoObject and IDictionary