You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
5.1KB

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <title>json</title>
  6. <style>
  7. html, body {
  8. margin: 0;
  9. padding: 0;
  10. overflow: hidden;
  11. }
  12. body {
  13. height: 100vh;
  14. width: 100vw;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <script>
  20. var мир = {};
  21. мир.строкаПути = function(п) {
  22. function вСтроку(ключ) {
  23. return `["${ключ}"]`;
  24. }
  25. return "мир" + п.map(вСтроку).join("") + " = ";
  26. };
  27. мир.создатьПуть = function(путь) {
  28. var уровень = мир;
  29. var длина = путь.length;
  30. for (var i = 0; i < длина; ++i)
  31. {
  32. var п = путь[i];
  33. if (!уровень[п])
  34. {
  35. уровень[п] = {};
  36. }
  37. else
  38. {
  39. уровень = уровень[п];
  40. }
  41. }
  42. };
  43. мир.разобрать = function(словарь, путь = []) {
  44. for (ключ in словарь)
  45. {
  46. var внутреннийПуть = путь.slice();
  47. внутреннийПуть.push(ключ);
  48. var значение = словарь[ключ];
  49. мир.создатьПуть(внутреннийПуть);
  50. if (typeof значение === "string")
  51. {
  52. // Функция.
  53. if (значение.startsWith("function"))
  54. {
  55. var содержимое = мир.строкаПути(внутреннийПуть) + значение;
  56. eval(содержимое);
  57. }
  58. // Строка.
  59. else
  60. {
  61. var содержимое = мир.строкаПути(внутреннийПуть) + '"' + значение + '"';
  62. eval(содержимое);
  63. }
  64. }
  65. /*
  66. // Массив.
  67. else if (Array.isArray(значение))
  68. {
  69. console.debug("разобрать массив");
  70. }
  71. */
  72. // Словарь.
  73. else if (значение === Object(значение))
  74. {
  75. мир.разобрать(значение, внутреннийПуть);
  76. }
  77. // Неизвестное.
  78. else
  79. {
  80. console.error("неизвестная пара ключ/значение", ключ, значение);
  81. }
  82. }
  83. };
  84. console.debug("строки отдельно", {строки: ["a", "b", "c"]});
  85. var json1 = {
  86. строки: [
  87. "abc",
  88. "def",
  89. "ghi",
  90. {
  91. ключ: "uuu",
  92. },
  93. ],
  94. вывести: function(аргумент) {
  95. console.debug('выводим аргумент:', аргумент);
  96. }.toString(),
  97. пример: function(аргумент) {
  98. мир.вывести("уга");
  99. console.debug("функция-пример исполнена. аргумент:", аргумент);
  100. }.toString(),
  101. набор: {
  102. проба: function() {
  103. console.debug("это проба");
  104. }.toString(),
  105. простоСтрока: "уппамам",
  106. глубже: {
  107. ещё: {
  108. функция9на12: function(аргумент) {
  109. console.debug("функция9на12", аргумент);
  110. }.toString(),
  111. опятьСтрока: "ого",
  112. },
  113. },
  114. },
  115. };
  116. json2 = JSON.stringify(json1);
  117. console.debug("2", json2);
  118. var json3 = JSON.parse(json2);
  119. console.debug("3", json3);
  120. мир.разобрать(json3);
  121. console.debug("мир.пример", мир.пример);
  122. мир.пример(123);
  123. мир.вывести(77);
  124. console.debug("мир", мир);
  125. </script>
  126. </body>
  127. </html>