首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自定义Json序列化程序创建集合

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

Stack Overflow用户
提问于 2014-11-10 09:26:06
回答 1查看 2.7K关注 0票数 2

这段代码是Json网络API控制器的一部分,在将其发送到UI之前,我有一个特殊的要求在最终的Json中修改某些值。

我的当前代码如下:

代码语言:javascript
复制
// 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);
        }
    }

我面临的问题如下:

代码语言:javascript
复制
{ 
   "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 }, 
  "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
}

但是,我希望得到以下结果,因为我正在序列化一个集合(.Net列表类型,.Net集合)

代码语言:javascript
复制
[ 
   "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 }, 
  "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
]

事实上,当我试图在林特中验证时,当前的结果显示了有效的Json,但是终止了其中的一部分,因此它显示了下面的有效Json,但是这只是一个转移

代码语言:javascript
复制
{
    "ED": {
        "ID-4": 9000,
        "ID-5": 12000,
        "ID-6": 11000
    }
}

我尝试过用writer.WriteStartObject();writer.WriteEndObject();替换writer.WriteStartArray();writer.WriteEndArray();,在遍历类型中的列表的第一个foreach循环之前,但是这会导致异常,所以没有帮助。

代码语言:javascript
复制
"exceptionMessage": "Token StartArray in state ObjectStart would result in an invalid JSON object. Path '

如有任何解决问题的建议,如需澄清,请通知我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-10 15:36:02

JSON中,名称-值对必须在对象{}中;它们不能直接位于数组[]中。因此,您要创建的这个JSON是无效的,这就是为什么您要得到一个异常:

代码语言:javascript
复制
[ 
   "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 }, 
   "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
]

为了使其成为有效的集合,必须将每个ED名称-值对包装在如下对象中:

代码语言:javascript
复制
[ 
   { 
      "ED": { "ID-1": 10000, "ID-2": 13000, "ID-3": 15000 } 
   }, 
   { 
      "ED": { "ID-4": 9000, "ID-5": 12000, "ID-6": 11000 } 
   }
]

一旦看到这一点,解决方案就变得清晰起来:在您的DataMapListSerializer中,您需要在循环之外使用writer.WriteStartArray()writer.WriteEndArray(),并且需要在循环中添加writer.WriteStartObject()writer.WriteEndObject()

代码语言:javascript
复制
    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();

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26840436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档