C# 使用自定义Json序列化程序创建集合

C# 使用自定义Json序列化程序创建集合,c#,json,serialization,asp.net-web-api,json.net,C#,Json,Serialization,Asp.net Web Api,Json.net,这段代码是ASP.NETWebAPI控制器的一部分,在将其发送到UI之前,我需要修改最终Json中的某些值 我当前的代码如下所示: // Web API controller public partial class ViewRController { [HttpGet] public DataMapList FetchEmployeeDataList() { DataMapList

这段代码是ASP.NETWebAPI控制器的一部分,在将其发送到UI之前,我需要修改最终Json中的某些值

我当前的代码如下所示:

// Web API controller

public partial class ViewRController
        {
       [HttpGet]
            public DataMapList FetchEmployeeDataList()
            {
                DataMapList returnDataMapList = new DataMapList();

                return (returnDataMapList);
            }
        }

// Type definition and details

    [JsonObject]
        [JsonConverter(typeof(DataMapListSerializer))]
        public class DataMapList
        {
            public List<Dictionary<object, object>> employeeSalaryMappingList = null;

            public DataMapList()
            {
                employeeSalaryMappingList = new List<Dictionary<object, object>>();
                employeeSalaryMappingList.Add(new Dictionary<object, object>());

                employeeSalaryMappingList[0].Add(1, 10000);
                employeeSalaryMappingList[0].Add(2, 13000);
                employeeSalaryMappingList[0].Add(3, 15000);

                employeeSalaryMappingList.Add(new Dictionary<object, object>());

                employeeSalaryMappingList[1].Add(4, 9000);
                employeeSalaryMappingList[1].Add(5, 12000);
                employeeSalaryMappingList[1].Add(6, 11000);
            }
        }

// Custom Json serializer

public class DataMapListSerializer : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var employeeSalaryDataMapList = value as DataMapList;
            var employeeSalaryMappingList = employeeSalaryDataMapList.employeeSalaryMappingList;


            writer.WriteStartObject();
            foreach (var employeeSalaryMappingDictionary in employeeSalaryMappingList)
            {
                writer.WritePropertyName("ED");
                writer.WriteStartObject();

                foreach (var keyValuePair in employeeSalaryMappingDictionary)
                {
                    writer.WritePropertyName("ID-" + keyValuePair.Key);
                    serializer.Serialize(writer, keyValuePair.Value);
                }

                writer.WriteEndObject();
            }

            writer.WriteEndObject();
        }       

        public override bool CanConvert(Type objectType)
        {
            return typeof(DataMapList).IsAssignableFrom(objectType);
        }
    }
但是,我希望得到以下结果,因为我正在序列化集合.Net列表类型.Net集合

[ 
   "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 }, 
  "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
]
事实上,当我尝试在中验证时,当前结果显示了有效的Json,但终止了其中的一部分,因此它将以下内容显示为有效的Json,但这只是一种转移

{
    "ED": {
        "ID-4": 9000,
        "ID-5": 12000,
        "ID-6": 11000
    }
}
我已尝试替换writer.WriteStartObject;和writer.WriteEndObject;作者:WriteStartaray;和作家。写达雷;,在第一个foreach循环之前遍历类型中的列表,但这会导致异常,因此没有帮助

"exceptionMessage": "Token StartArray in state ObjectStart would result in an invalid JSON object. Path '
任何解决问题的建议,如果您需要任何澄清,请告诉我,在中,名称-值对必须位于对象{}内;它们不能直接位于数组[]内。因此,您尝试创建的这个JSON无效,这就是为什么会出现异常:

[ 
   "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 }, 
   "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
]
为了使其成为有效集合,每个ED名称-值对必须包装在如下对象中:

[ 
   { 
      "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 } 
   }, 
   { 
      "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
   }
]
一旦您看到这一点,解决方案就会变得清晰:在DataMapListSerializer中,您需要在循环外部使用writer.WriteStarray和writer.WriteEndArray,并且需要在循环内部添加writer.WriteStarObject和writer.WriteEndObject

    writer.WriteStartArray();

    foreach (var employeeSalaryMappingDictionary in employeeSalaryMappingList)
    {
        writer.WriteStartObject();

            writer.WritePropertyName("ED");
            writer.WriteStartObject();

            foreach (var keyValuePair in employeeSalaryMappingDictionary)
            {
                writer.WritePropertyName("ID-" + keyValuePair.Key);
                serializer.Serialize(writer, keyValuePair.Value);
            }

            writer.WriteEndObject();

        writer.WriteEndObject();
    }

    writer.WriteEndArray();

Fiddle:

{data:[{ID44:2,ID43:Block},{ID44:1,ID43:Train}}}这将是一个有效的Json,我已经验证过了。您是对的,我需要将所有内容包装在{}中,以使其成为有效的Json。所以我需要做的就是把所有东西都包装在writer.WriteStartObject中;writer.WriteEndObject;在链接处修改了代码,感谢您提供的清晰性
    writer.WriteStartArray();

    foreach (var employeeSalaryMappingDictionary in employeeSalaryMappingList)
    {
        writer.WriteStartObject();

            writer.WritePropertyName("ED");
            writer.WriteStartObject();

            foreach (var keyValuePair in employeeSalaryMappingDictionary)
            {
                writer.WritePropertyName("ID-" + keyValuePair.Key);
                serializer.Serialize(writer, keyValuePair.Value);
            }

            writer.WriteEndObject();

        writer.WriteEndObject();
    }

    writer.WriteEndArray();