C# 使用ExpandooObject和IDictionary创建JSON时,允许同一个键有多个值

C# 使用ExpandooObject和IDictionary创建JSON时,允许同一个键有多个值,c#,json,json.net,expandoobject,idictionary,C#,Json,Json.net,Expandoobject,Idictionary,我正在尝试使用ExpandoObject和IDictionary创建动态JSON 在动态创建JSON的过程中,可能会出现名称或值重复的实例。但是,将重复的名称或值添加到ExpandooObject时,会出现错误: 已添加具有相同密钥的项 下面是我的代码片段: DataTable dt_MappedColumns = (DataTable)ViewState["MappedColumns"]; dynamic ManCols = new ExpandoObject(); var dictionar

我正在尝试使用ExpandoObject和IDictionary创建动态JSON

在动态创建JSON的过程中,可能会出现名称或值重复的实例。但是,将重复的名称或值添加到ExpandooObject时,会出现错误:

已添加具有相同密钥的项

下面是我的代码片段:

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);
在上表中,前3行成功添加到
字典1
;然而,当我们尝试添加第四行时,它给出了错误

我希望重复值的JSON结构如下所示:

Sr.No TColumnName AColumnName
----- ----------- -----------
1     Apple       Lion
2     Orange      Tiger
3     Mango       Fox
4     Orange      Wolf
{“苹果”:“狮子”、“橘子”:[“老虎”、“狼”],“芒果”:“狐狸”}


是否可以从表中创建此JSON结构?

确保这是可能的。在循环中,您只需要检查字典中是否已经存在密钥,并采取适当的操作。有三种情况:

  • 密钥不存在,请按现在的操作添加它
  • 键存在并且现有值是字符串,在这种情况下,需要用包含旧字符串值和新字符串值的列表替换它
  • 键存在并且现有值是一个列表,在这种情况下,您只需要将新字符串添加到列表中
下面是代码的样子:

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);
        }
    }
}
foreach(dt_MappedColumns.Rows中的数据行dr)
{
string key=dr[“TColumnName”].ToString();
字符串值=dr[“AColumnName”].ToString();
如果(!dictionary1.ContainsKey(键))
{
//密钥不存在,请添加它
字典1.添加(键、值);
}
其他的
{
//键存在,获取现有值
objectexistingvalue=dictionary1[key];
如果(现有值为字符串)
{
//用列表替换现有字符串值
dictionary1[key]=新列表{(字符串)现有值,值};
}
其他的
{
//现有值是一个列表,因此将新值添加到其中
((列表)现有值)。添加(值);
}
}
}

Fiddle:

与其只提供一个包含我们不知道的数据的代码段,不如创建一个我们可以运行的代码段,其中包含重现问题所需的所有数据,最好是解释一下您希望输出的内容。@JonSkeet:Edit make,如果这有帮助的话..不是很多-我仍然不能复制/粘贴/编译/运行代码。(你的问题一开始就依赖于它在数据表中吗?我不明白为什么会这样。)但从根本上说,你想要的JSON是一个不好的JSON,结果显式不确定-请参见。@JonSkeet:JSON Structure edit澄清JonSkeet的评论:创建一个有时有列表的JSON是一个不好的主意,但其他时候只有一个值。这对接收json的人来说是一个严重的负担。正确的解决方案是始终为允许多个副本的任何属性创建一个列表。在这里,“橙色”可以有重复项,所以一定要列出。一个值:
{“橙色”:[“老虎”]}
。如果允许任何键具有重复项,则将其全部列出。在这种情况下,输出将是
{“Apple”:[“Lion”],“Orange”:[“Tiger”,“Wolf”],“Mango”:[“Fox”]}
。更容易处理。只是有点。。。。工作起来很有魅力:)谢谢@BrainRogers提供的宝贵帮助。。在运行上述代码之后,由于我使用的是Visual Studio,所以我得到了带有转义字符的Json字符串。。。“{\'Apple\':\'Lion\',\'Orange\':[\'Tiger\',\'Wolf\'],\'Mango\':\'Fox\'}”我们如何从Json字符串中删除转义'\'字符。@Mufaddal如果在Json中获得转义字符,则可能是双重序列化数据。当您使用
JsonConvert.SerializeObject()
序列化数据,并且在ASP.NET MVC中使用类似
Json()
的框架方法返回数据时,就会发生这种情况。请参阅以获取示例以及如何修复它。感谢您的回复,但是我通过将其转换为JObject并按如下方式使用解决了问题:var Varjson=JObject.Parse(Manjson);然后使用Varjson对象。:)干杯