json.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import deepExtend from './deepextend';
  2. import {err} from './console';
  3. import is, {hasProperty} from './type';
  4. const PREFIX = '[[FORM-CREATE-PREFIX-';
  5. const SUFFIX = '-FORM-CREATE-SUFFIX]]';
  6. const $T = '$FN:';
  7. const $TX = '$FNX:';
  8. const FUNCTION = 'function';
  9. export function toJson(obj, space) {
  10. return JSON.stringify(deepExtend([], obj, true), function (key, val) {
  11. if (val && val._isVue === true)
  12. return undefined;
  13. if (typeof val !== FUNCTION) {
  14. return val;
  15. }
  16. if (val.__json) {
  17. return val.__json;
  18. }
  19. if (val.__origin)
  20. val = val.__origin;
  21. if (val.__emit)
  22. return undefined;
  23. return PREFIX + val + SUFFIX;
  24. }, space);
  25. }
  26. function makeFn(fn) {
  27. return eval('(' + FUNCTION + '(){return ' + fn + ' })()')
  28. }
  29. export function parseFn(fn, mode) {
  30. if (fn && is.String(fn) && fn.length > 4) {
  31. let v = fn.trim();
  32. let flag = false;
  33. try {
  34. if (v.indexOf(SUFFIX) > 0 && v.indexOf(PREFIX) === 0) {
  35. v = v.replace(SUFFIX, '').replace(PREFIX, '');
  36. flag = true;
  37. } else if (v.indexOf($T) === 0) {
  38. v = v.replace($T, '');
  39. flag = true;
  40. } else if (v.indexOf($TX) === 0) {
  41. v = makeFn('function($inject){' + v.replace($TX, '') + '}');
  42. v.__json = fn;
  43. v.__inject = true;
  44. return v;
  45. } else if (!mode && v.indexOf(FUNCTION) === 0 && v !== FUNCTION) {
  46. flag = true;
  47. }
  48. if (!flag) return fn;
  49. const val = makeFn((v.indexOf(FUNCTION) === -1 && v.indexOf('(') !== 0) ? (FUNCTION + ' ' + v) : v);
  50. val.__json = fn;
  51. return val;
  52. } catch (e) {
  53. err(`解析失败:${v}\n\nerr: ${e}`);
  54. return undefined;
  55. }
  56. }
  57. return fn;
  58. }
  59. export function parseJson(json, mode) {
  60. return JSON.parse(json, function (k, v) {
  61. if (is.Undef(v) || !v.indexOf) return v;
  62. return parseFn(v, mode);
  63. });
  64. }