json.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import deepExtend from './deepextend';
  2. import {err} from './console';
  3. import is from './type';
  4. const PREFIX = '[[FORM-CREATE-PREFIX-';
  5. const SUFFIX = '-FORM-CREATE-SUFFIX]]';
  6. export function toJson(obj, space) {
  7. return JSON.stringify(deepExtend(Array.isArray(obj) ? [] : {}, obj, true), function (key, val) {
  8. if (val && val._isVue === true)
  9. return undefined;
  10. if (typeof val !== 'function') {
  11. return val;
  12. }
  13. if (val.__json) {
  14. return val.__json;
  15. }
  16. if (val.__origin)
  17. val = val.__origin;
  18. if (val.__emit)
  19. return undefined;
  20. return PREFIX + val + SUFFIX;
  21. }, space);
  22. }
  23. function makeFn(fn) {
  24. return (new Function('return ' + fn))();
  25. }
  26. export function parseFn(fn, mode) {
  27. if (fn && is.String(fn) && fn.length > 4) {
  28. let v = fn.trim();
  29. let flag = false;
  30. try {
  31. if (v.indexOf(SUFFIX) > 0 && v.indexOf(PREFIX) === 0) {
  32. v = v.replace(SUFFIX, '').replace(PREFIX, '');
  33. flag = true;
  34. } else if (v.indexOf('$FN:') === 0) {
  35. v = v.substring(4);
  36. flag = true;
  37. } else if (v.indexOf('$EXEC:') === 0) {
  38. v = v.substring(6);
  39. flag = true;
  40. } else if (v.indexOf('$GLOBAL:') === 0) {
  41. const name = v.substring(8);
  42. v = function (...args) {
  43. const callback = args[0].api.getGlobalEvent(name);
  44. if (callback) {
  45. return callback.call(this, ...args);
  46. }
  47. return undefined;
  48. }
  49. v.__json = fn;
  50. v.__inject = true;
  51. return v;
  52. } else if (v.indexOf('$FNX:') === 0) {
  53. v = makeFn('function($inject){' + v.substring(5) + '}');
  54. v.__json = fn;
  55. v.__inject = true;
  56. return v;
  57. } else if (!mode && v.indexOf('function ') === 0 && v !== 'function ') {
  58. flag = true;
  59. } else if (!mode && v.indexOf('function(') === 0 && v !== 'function(') {
  60. flag = true;
  61. }
  62. if (!flag) return fn;
  63. let val;
  64. try{
  65. val = makeFn(v);
  66. }catch (e){
  67. val = makeFn('function ' + v);
  68. }
  69. val.__json = fn;
  70. return val;
  71. } catch (e) {
  72. err(`解析失败:${v}\n\nerr: ${e}`);
  73. return undefined;
  74. }
  75. }
  76. return fn;
  77. }
  78. export function parseJson(json, mode) {
  79. return JSON.parse(json, function (k, v) {
  80. if (is.Undef(v) || !v.indexOf) return v;
  81. return parseFn(v, mode);
  82. });
  83. }