Источник:
http://axforum.info/forums/blog.php?b=429
==============
Сегодня поучаствовал в
одном из обсуждений на форуме и вспомнил, что задолжал общественности одну полезную доработку стандартной JS библиотеки в составе SDK, SDK.REST.js.
Для интерпретации JSON результата библиотека использует функцию
X++:
_dateReviver: function (key, value) {
/// /// Private function to convert matching string values to Date objects. /// /// /// The key used to identify the object property /// /// /// The string value representing a date /// var a;
if (typeof value ===
'string') { a = /Date\(([-+]?\d+)\)/.exec(value);
if (a) {
return new Date(parseInt(value.replace(
"/Date(",
"").replace(
")/",
""), 10)); } }
return value; }
К ней у меня нет претензий, однако почему бы не ограничиваться только датами? Есть и другие типы, которые по недосмотру разработчиков по разному устроены в JS и .NET API. Для того чтобы прозрачнее интерпретировать JSON результат я использовал следующую функцию:
X++:
_xrmTypeReviver: function (key, value) {
/// /// Private function to convert matching string values to Date objects. /// agrunin: функция дополнена для преобразования EntityReference в lookup понятный Xrm.Page /// /// /// The key used to identify the object property /// /// /// The string value representing a date or EntityReference /// var a;
if (typeof value ===
'string') { a = /Date\(([-+]?\d+)\)/.exec(value);
if (a) {
return new Date(parseInt(value.replace(
"/Date(",
"").replace(
")/",
""), 10)); } }
else if (value !=
null && typeof value ==
'object') {
if (value[
"__metadata"] != undefined) { var type = value[
"__metadata"].type;
switch (type) {
case "Microsoft.Crm.Sdk.Data.Services.EntityReference":
if (value.Id ==
null) {
// Возвращаем null вместо пустого объекта return null; } else {
return { id: value.Id, entityType: value.LogicalName, name: value.Name }; }
case "Microsoft.Crm.Sdk.Data.Services.Money":
case "Microsoft.Crm.Sdk.Data.Services.OptionSetValue":
return value.Value;
default:
return value; } } }
return value; }
Она позволяет приводить EntityReference к JS объекту Lookup, а так же извлекает примитивное значение из объектов Money и OptionSetValue. Отмечу так же, что мой обработчик возвращает null вместо пустого EntityReference, как это делает стандартная библиотека.
Источник:
http://axforum.info/forums/blog.php?b=429