2016-05-13 46 views
0

我正在通过读取对象列表中的一些数据,将其转换为嵌套字典并序列化结果来创建JSON文件。所需的JSON格式如下:在将列表转换为字典时获取重复的JSON项目

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

但我得到这个JSON输出,而不是:

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

这里是我使用的代码:

public class LabelData 
{ 
    public int StartRange { get; set; } 
    public int EndRange { get; set; } 
} 

public class ConfigInfo 
{ 
    public string ParentGroup; 
    public string Label; 
    public int ID; 
    public int StartRange; 
    public int EndRange; 
} 

public Dictionary<string, Dictionary<string, LabelData>> GetData(List<ConfigInfo> configList) 
{ 
    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()) 
     }); 
    } 

    return labelData; 
} 

protected void createFile() 
{ 
    List<ConfigInfo> configInfoList = new List<ConfigInfo>(); 

    ConfigInfo configInfo = new ConfigInfo(); 
    configInfo.ParentGroup = "Employee1"; 
    configInfo.StartRange = 11; 
    configInfo.EndRange = 22; 
    configInfo.Label = "YYY"; 
    configInfoList.Add(configInfo); 

    configInfo = new ConfigInfo(); 
    configInfo.ParentGroup = "Employee2"; 
    configInfo.StartRange = 24; 
    configInfo.EndRange = 56; 
    configInfo.Label = "XXX"; 
    configInfoList.Add(configInfo); 

    if (!File.Exists(fileName)) 
    { 
     FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write); 
     StreamWriter sw = new StreamWriter(fs); 
     JsonTextWriter writer = new JsonTextWriter(sw); 

     Dictionary<string, Dictionary<string, LabelData>> data = GetData(configInfoList); 
     string json = JsonConvert.SerializeObject(data,Formatting.Indented); 
     sw.Write(json); 
     sw.Close(); 
    } 
} 

我觉得问题可能与两个类中都有StartRange和EndRange有关,但我不知道如何解决它。我究竟做错了什么?

+0

我不明白你的要求。在最终期望的输出中,您希望Employee1的Label,StartRange和EndRange显示在Employee2下,并且您希望Employee2的Label,StartRange和EndRange显示在Employee1下面?如果列表中有三名员工而不是2名,会发生什么情况?如果只有1个呢? –

+0

如果有一个雇员的输出将是 – Vinoth

+0

如果有一个雇员的输出将是{ “Employee1”:{ “YYY”:{ “StartRange”:11, “EndRange”:22 } } }如果有三个员工输出将是{ “Employee1”:{ “YYY”:{ “StartRange”:11, “EndRange”:22 } }, “和Employee2”:{ “ YYY“:{ ”StartRange“:24, ”EndRange“:56 } }, “Employee3”: “AAA”:{ “StartRange”:56, “EndRange”:99 } } – Vinoth

回答

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包含在合并列表Label的每一个项目的结果当前项目的StartRangeEndRange

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

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

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

顺便说一句,我想我会建议重新命名GetData方法TransformData,因为这是真的它在做什么。