Dynamics CRM查询数据返回的JSON数组前端无法正确格式化问题
问题根因
你遇到的问题本质是ASP.NET MVC内置的Json()方法默认序列化器和Newtonsoft.Json的JObject/JArray类型不兼容导致的。内置的JavaScriptSerializer无法识别Newtonsoft的JSON对象结构,会直接序列化JObject/JArray的内部属性,最终返回的结构就会出现异常的嵌套数组,而非预期的键值对。
解决方案
方案1:替换JArray/JObject为字典+匿名类(推荐,改动最小)
直接用C#原生字典存储CRM拉取的属性,不需要依赖Newtonsoft的JSON对象类型,内置序列化器可正常处理:
var crmItems = new List<object>(); using (var CrmSvc = new CrmConnectionManager()) { EntityCollection OrdersList = CrmSvc.Connection.RetrieveMultiple(new FetchExpression(fetchForSupplier)); foreach (var item in OrdersList.Entities) { var crmItem = new Dictionary<string, object>(); foreach (KeyValuePair<String, string> attribute in item.FormattedValues) { crmItem[attribute.Key] = attribute.Value; } crmItems.Add(crmItem); } } return Json(new { status = "success", result = crmItems } , JsonRequestBehavior.AllowGet);
方案2:手动用Newtonsoft序列化后返回字符串
如果需要保留原有JArray/JObject的逻辑,直接序列化整个返回结果为字符串,返回Content类型响应即可:
// 原有JArray生成逻辑不变 JArray crmItems = new JArray(); JObject crmItem; using (var CrmSvc = new CrmConnectionManager()) { EntityCollection OrdersList = CrmSvc.Connection.RetrieveMultiple(new FetchExpression(fetchForSupplier)); foreach (var item in OrdersList.Entities) { crmItem = new JObject(); foreach (KeyValuePair<String, string> attribute in item.FormattedValues) { crmItem.Add(new JProperty(attribute.Key, attribute.Value)); } crmItems.Add(crmItem); } } // 手动序列化+返回JSON响应 var responseObj = new { status = "success", result = crmItems }; string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(responseObj); return Content(jsonStr, "application/json");
方案3:全局替换MVC序列化器
如果项目整体统一用Newtonsoft.Json处理JSON,可以在Global.asax的Application_Start方法里修改默认序列化器,修改完成后就可以直接把JObject/JArray传到Json()方法里正常返回,无需额外处理。
内容的提问来源于stack exchange,提问作者Ola Hansen
相关产品推荐
相关产品推荐

