Needed this for a project – would probably choose another implementation in Ax 2012 – need support for arrays.
static str map2JSON(Map _map)
{
str json;
boolean first;
str enumValueString;
MapEnumerator mapenum;
map testmap,valuemap;
container tmpcon;
str enumValue2str(anytype _value, enumId _enumId = 0)
{
DictEnum dictEnum;
;
if (_enumId == 0 && typeof(_value) == Types::Enum)
{
_enumId = DictEnum::value2id(_value);
}
dictEnum = new DictEnum(_enumId);
return dictEnum.value2Symbol(_value) ;
}
str keyvaluehandling(anytype _value)
{
types _theType;;
_theType = typeof(_value);
switch (_theType)
{
case Types::RString:
case Types::VarString:
case Types::String: return strfmt(‘”%1″‘,_value);
break;
case Types::Integer:
return int2str(_value);
break;
case Types::Int64:
return int642str(_value);
break ;
case Types::Real:
return num2str(_value,
/* min chars */ 1,
/* decimals */ 4,
/* decimals = point */ 1,
/* no thousand sep */ 0);
break;
case Types::Date:
if(_value)
{
return strfmt(‘”%1″‘,date2str(_value, 321, 2, 3, 2, 3, 4));
}
else
{
return ‘”1900-01-01″‘;
}
break;
case Types::Enum:
enumValueString = enumValue2str(_value);
return strfmt(‘”%1″‘,enumValueString);
break;
case Types::Guid:
return strfmt(‘”%1″‘,guid2str(_value));
break ;
case Types::Container:
valuemap = map::create(_value);
if (sysdictclass::isEqualOrSuperclass(classidget(testmap),classidget(valuemap)))
{
return RetailCommonWebAPI::map2JSON(valuemap);
}
case Types::UtcDateTime:
case Types::Record:
case Types::UserType:
case Types::AnyType:
case Types::BLOB:
case Types::void:
default : throw(error(strfmt(“@SYS73815″,_theType))) ;
}
return ”;
}
str handleKeypair(str keyname, anytype keyvalue)
{
return ( first ? strfmt(‘,”%1″:%2’,keyname,keyvaluehandling(keyvalue)) : strfmt(‘”%1″:%2’,keyname,keyvaluehandling(keyvalue)));
}
;
mapenum = _map.getEnumerator();
while (mapenum.moveNext())
{
json += handleKeypair(mapenum.currentKey(),conpeek(mapenum.currentValue(),1));
first = true;
}
return strfmt(‘{%1}’,json);
}
Test job:
static void soa_test_newPaymentServices(Args _args)
{
abcmodel testenum = ABCModel::Revenue;
Map mymap = new Map(types::String,types::Container);
Map mapinmap = new Map(types::String,types::Container);;
mapinmap.insert(“mapinmap_text”,[“en tekst”]);
mapinmap.insert(“mapinmap_integrer”, [5]);
mymap.insert(“text”,[“en tekst”]);
mymap.insert(“integrer”, [5]);
mymap.insert(“real”,[1.5432]);
mymap.insert(“enum”, [testenum]);
mymap.insert(“date”, [systemdateget()]);
mymap.insert(“map”, [mapinmap.pack()]);
mymap.insert(“date2”, [systemdateget()]);
info(RetailCommonWebAPI::map2JSON(mymap));
}