在将List转换为Dictionary时获取重复的JSON项

时间:2016-05-13 11:19:07

标签: c# json json.net

我通过从对象List中读取一些数据,将其转换为嵌套的Dictionaries并序列化结果来创建JSON文件。所需的JSON格式如下:

InBetween

但我得到的是这个JSON输出:

{
  "Employee1": {
    "YYY": {
      "StartRange": 11,
      "EndRange": 22
    }
  },
  "Employee2": {
    "XXX": {
      "StartRange": 24,
      "EndRange": 56
    }
  }
}

以下是我正在使用的代码:

{
  "Employee1": {
    "YYY": {
      "StartRange": 11,
      "EndRange": 22
    },
    "XXX": {
      "StartRange": 11,
      "EndRange": 22
    }
  },
  "Employee2": {
    "YYY": {
      "StartRange": 24,
      "EndRange": 56
    },
    "XXX": {
      "StartRange": 24,
      "EndRange": 56
    }
  }
}

我认为问题可能与两个类中都有StartRange和EndRange有关,但我不知道如何修复它。我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题在于GetData方法中的代码:

var labelData = new Dictionary<string, Dictionary<string, LabelData>>();

foreach (var listItem in configList)
{
    labelData[listItem.ParentGroup] = 
        configList.Distinct().ToDictionary(x => x.Label.ToString(), row => new LabelData()
    {
        StartRange = Convert.ToInt32(listItem.StartRange.ToString()),
        EndRange = Convert.ToInt32(listItem.EndRange.ToString())
    });
}

对于列表中的每个ConfigInfo项,您要在结果中添加Dictionary,其中<{1>} 列表中的每个项目与当前项目的LabelStartRange

我认为你真正想要的是按EndRange对项目进行分组,然后为每个只包含该组中项目的组创建词典。用以下代码替换上面的代码,你应该得到你期望的输出:

ParentGroup

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

顺便说一句,我想我会建议您将var labelData = configList .GroupBy(c => c.ParentGroup) .ToDictionary( g => g.Key, g => g.ToDictionary( c => c.Label, c => new LabelData { StartRange = c.StartRange, EndRange = c.EndRange } ) ); 方法重命名为GetData,因为这正是它正在做的事情。