C#中选择的JSON列表属性

时间:2016-09-14 06:20:34

标签: c# json

我有一个包含8个属性和值的列表。但我想只得到其中一些IOType ==" O"并转换为json格式。

list

如果我像LINQ一样使用

excelIO.Where(m => m.IOType == "O").Select(m => new ExcelBo { InterfaceColId = m.InterfaceColId, IOValue = m.IOValue }).ToList();
return JsonConvert.SerializeObject(excelBoList);

当前输出

[{"FunctionWBId":0,"ExcelCellNo":null,"IOType":null,
"InterfaceColId":"txtPrmServicTaxAmt","IOValue":"0.00","DataType":null,
"Status":null,"FunctionWBMap":null},
    {"FunctionWBId":0,"ExcelCellNo":null,"IOType":null,
"InterfaceColId":"txtPrmStampDutyAmt","IOValue":"10.00",
"DataType":null,"Status":null,"FunctionWBMap":null}]

所需的输出:" InterfaceColId"值将是一个字符串和' IOValue"价值将是一个价值。

[{"txtPrmServicTaxAmt":"0.00","txtPrmStampDutyAmt" :"10.00"}]

请帮我提供所需的输出?

1 个答案:

答案 0 :(得分:0)

最简单的方法是将值存储到字典而不是列表中:

var excelBoDict = excelIO.Where(m => m.IOType == "O")
                    .ToDictionary(x => x.InterfaceColId, y => y.IOValue);
return JsonConvert.SerializeObject(excelBoDict);

这将被序列化为:

[{"txtPrmServicTaxAmt":"0.00","txtPrmStampDutyAmt" :"10.00"}]

如果您没有InterfaceColId的重复值,它将起作用。如果是这样,我猜你需要以下列方式基于JsonTextWriterexample usage)实现自己的序列化程序:

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

using (JsonWriter writer = new JsonTextWriter(sw))
{
    writer.WriteStartObject();
    foreach(var item in excelBoList)
    {
        writer.WritePropertyName(item.InterfaceColId);
        writer.WriteValue(item.IOValue);
    }
    writer.WriteEnd();
    writer.WriteEndObject();
}

var result = sb.ToString();

请注意,如果您有多个具有单个名称的属性 - 这可能会导致不可预测的行为。