json.cpp 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611
  1. /**************************************************************************/
  2. /* json.cpp */
  3. /**************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /**************************************************************************/
  8. /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
  9. /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /**************************************************************************/
  30. #include "json.h"
  31. #include "core/config/engine.h"
  32. #include "core/io/file_access.h"
  33. #include "core/object/script_language.h"
  34. #include "core/variant/container_type_validate.h"
  35. const char *JSON::tk_name[TK_MAX] = {
  36. "'{'",
  37. "'}'",
  38. "'['",
  39. "']'",
  40. "identifier",
  41. "string",
  42. "number",
  43. "':'",
  44. "','",
  45. "EOF",
  46. };
  47. void JSON::_add_indent(String &r_result, const String &p_indent, int p_size) {
  48. for (int i = 0; i < p_size; i++) {
  49. r_result += p_indent;
  50. }
  51. }
  52. void JSON::_stringify(String &r_result, const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, HashSet<const void *> &p_markers, bool p_full_precision) {
  53. if (p_cur_indent > Variant::MAX_RECURSION_DEPTH) {
  54. r_result += "...";
  55. ERR_FAIL_MSG("JSON structure is too deep. Bailing.");
  56. }
  57. const char *colon = p_indent.is_empty() ? ":" : ": ";
  58. const char *end_statement = p_indent.is_empty() ? "" : "\n";
  59. switch (p_var.get_type()) {
  60. case Variant::NIL:
  61. r_result += "null";
  62. return;
  63. case Variant::BOOL:
  64. r_result += p_var.operator bool() ? "true" : "false";
  65. return;
  66. case Variant::INT:
  67. r_result += itos(p_var);
  68. return;
  69. case Variant::FLOAT: {
  70. const double num = p_var;
  71. // Only for exactly 0. If we have approximately 0 let the user decide how much
  72. // precision they want.
  73. if (num == double(0.0)) {
  74. r_result += "0.0";
  75. return;
  76. }
  77. if (p_full_precision) {
  78. const String num_sci = String::num_scientific(num);
  79. if (num_sci.contains_char('.') || num_sci.contains_char('e')) {
  80. r_result += num_sci;
  81. } else {
  82. r_result += num_sci + ".0";
  83. }
  84. } else {
  85. const double magnitude = std::log10(Math::abs(num));
  86. const int precision = MAX(1, 14 - (int)Math::floor(magnitude));
  87. r_result += String::num(num, precision);
  88. }
  89. return;
  90. }
  91. case Variant::PACKED_INT32_ARRAY:
  92. case Variant::PACKED_INT64_ARRAY:
  93. case Variant::PACKED_FLOAT32_ARRAY:
  94. case Variant::PACKED_FLOAT64_ARRAY:
  95. case Variant::PACKED_STRING_ARRAY:
  96. case Variant::ARRAY: {
  97. Array a = p_var;
  98. if (p_markers.has(a.id())) {
  99. r_result += "\"[...]\"";
  100. ERR_FAIL_MSG("Converting circular structure to JSON.");
  101. }
  102. if (a.is_empty()) {
  103. r_result += "[]";
  104. return;
  105. }
  106. r_result += '[';
  107. r_result += end_statement;
  108. p_markers.insert(a.id());
  109. bool first = true;
  110. for (const Variant &var : a) {
  111. if (first) {
  112. first = false;
  113. } else {
  114. r_result += ',';
  115. r_result += end_statement;
  116. }
  117. _add_indent(r_result, p_indent, p_cur_indent + 1);
  118. _stringify(r_result, var, p_indent, p_cur_indent + 1, p_sort_keys, p_markers, p_full_precision);
  119. }
  120. r_result += end_statement;
  121. _add_indent(r_result, p_indent, p_cur_indent);
  122. r_result += ']';
  123. p_markers.erase(a.id());
  124. return;
  125. }
  126. case Variant::DICTIONARY: {
  127. Dictionary d = p_var;
  128. if (p_markers.has(d.id())) {
  129. r_result += "\"{...}\"";
  130. ERR_FAIL_MSG("Converting circular structure to JSON.");
  131. }
  132. r_result += '{';
  133. r_result += end_statement;
  134. p_markers.insert(d.id());
  135. LocalVector<Variant> keys = d.get_key_list();
  136. if (p_sort_keys) {
  137. keys.sort_custom<StringLikeVariantOrder>();
  138. }
  139. bool first_key = true;
  140. for (const Variant &key : keys) {
  141. if (first_key) {
  142. first_key = false;
  143. } else {
  144. r_result += ',';
  145. r_result += end_statement;
  146. }
  147. _add_indent(r_result, p_indent, p_cur_indent + 1);
  148. _stringify(r_result, String(key), p_indent, p_cur_indent + 1, p_sort_keys, p_markers, p_full_precision);
  149. r_result += colon;
  150. _stringify(r_result, d[key], p_indent, p_cur_indent + 1, p_sort_keys, p_markers, p_full_precision);
  151. }
  152. r_result += end_statement;
  153. _add_indent(r_result, p_indent, p_cur_indent);
  154. r_result += '}';
  155. p_markers.erase(d.id());
  156. return;
  157. }
  158. default:
  159. r_result += '"';
  160. r_result += String(p_var).json_escape();
  161. r_result += '"';
  162. return;
  163. }
  164. }
  165. Error JSON::_get_token(const char32_t *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str) {
  166. while (p_len > 0) {
  167. switch (p_str[index]) {
  168. case '\n': {
  169. line++;
  170. index++;
  171. break;
  172. }
  173. case 0: {
  174. r_token.type = TK_EOF;
  175. return OK;
  176. } break;
  177. case '{': {
  178. r_token.type = TK_CURLY_BRACKET_OPEN;
  179. index++;
  180. return OK;
  181. }
  182. case '}': {
  183. r_token.type = TK_CURLY_BRACKET_CLOSE;
  184. index++;
  185. return OK;
  186. }
  187. case '[': {
  188. r_token.type = TK_BRACKET_OPEN;
  189. index++;
  190. return OK;
  191. }
  192. case ']': {
  193. r_token.type = TK_BRACKET_CLOSE;
  194. index++;
  195. return OK;
  196. }
  197. case ':': {
  198. r_token.type = TK_COLON;
  199. index++;
  200. return OK;
  201. }
  202. case ',': {
  203. r_token.type = TK_COMMA;
  204. index++;
  205. return OK;
  206. }
  207. case '"': {
  208. index++;
  209. String str;
  210. while (true) {
  211. if (p_str[index] == 0) {
  212. r_err_str = "Unterminated string";
  213. return ERR_PARSE_ERROR;
  214. } else if (p_str[index] == '"') {
  215. index++;
  216. break;
  217. } else if (p_str[index] == '\\') {
  218. //escaped characters...
  219. index++;
  220. char32_t next = p_str[index];
  221. if (next == 0) {
  222. r_err_str = "Unterminated string";
  223. return ERR_PARSE_ERROR;
  224. }
  225. char32_t res = 0;
  226. switch (next) {
  227. case 'b':
  228. res = 8;
  229. break;
  230. case 't':
  231. res = 9;
  232. break;
  233. case 'n':
  234. res = 10;
  235. break;
  236. case 'f':
  237. res = 12;
  238. break;
  239. case 'r':
  240. res = 13;
  241. break;
  242. case 'u': {
  243. // hex number
  244. for (int j = 0; j < 4; j++) {
  245. char32_t c = p_str[index + j + 1];
  246. if (c == 0) {
  247. r_err_str = "Unterminated string";
  248. return ERR_PARSE_ERROR;
  249. }
  250. if (!is_hex_digit(c)) {
  251. r_err_str = "Malformed hex constant in string";
  252. return ERR_PARSE_ERROR;
  253. }
  254. char32_t v;
  255. if (is_digit(c)) {
  256. v = c - '0';
  257. } else if (c >= 'a' && c <= 'f') {
  258. v = c - 'a';
  259. v += 10;
  260. } else if (c >= 'A' && c <= 'F') {
  261. v = c - 'A';
  262. v += 10;
  263. } else {
  264. ERR_PRINT("Bug parsing hex constant.");
  265. v = 0;
  266. }
  267. res <<= 4;
  268. res |= v;
  269. }
  270. index += 4; //will add at the end anyway
  271. if ((res & 0xfffffc00) == 0xd800) {
  272. if (p_str[index + 1] != '\\' || p_str[index + 2] != 'u') {
  273. r_err_str = "Invalid UTF-16 sequence in string, unpaired lead surrogate";
  274. return ERR_PARSE_ERROR;
  275. }
  276. index += 2;
  277. char32_t trail = 0;
  278. for (int j = 0; j < 4; j++) {
  279. char32_t c = p_str[index + j + 1];
  280. if (c == 0) {
  281. r_err_str = "Unterminated string";
  282. return ERR_PARSE_ERROR;
  283. }
  284. if (!is_hex_digit(c)) {
  285. r_err_str = "Malformed hex constant in string";
  286. return ERR_PARSE_ERROR;
  287. }
  288. char32_t v;
  289. if (is_digit(c)) {
  290. v = c - '0';
  291. } else if (c >= 'a' && c <= 'f') {
  292. v = c - 'a';
  293. v += 10;
  294. } else if (c >= 'A' && c <= 'F') {
  295. v = c - 'A';
  296. v += 10;
  297. } else {
  298. ERR_PRINT("Bug parsing hex constant.");
  299. v = 0;
  300. }
  301. trail <<= 4;
  302. trail |= v;
  303. }
  304. if ((trail & 0xfffffc00) == 0xdc00) {
  305. res = (res << 10UL) + trail - ((0xd800 << 10UL) + 0xdc00 - 0x10000);
  306. index += 4; //will add at the end anyway
  307. } else {
  308. r_err_str = "Invalid UTF-16 sequence in string, unpaired lead surrogate";
  309. return ERR_PARSE_ERROR;
  310. }
  311. } else if ((res & 0xfffffc00) == 0xdc00) {
  312. r_err_str = "Invalid UTF-16 sequence in string, unpaired trail surrogate";
  313. return ERR_PARSE_ERROR;
  314. }
  315. } break;
  316. case '"':
  317. case '\\':
  318. case '/': {
  319. res = next;
  320. } break;
  321. default: {
  322. r_err_str = "Invalid escape sequence";
  323. return ERR_PARSE_ERROR;
  324. }
  325. }
  326. str += res;
  327. } else {
  328. if (p_str[index] == '\n') {
  329. line++;
  330. }
  331. str += p_str[index];
  332. }
  333. index++;
  334. }
  335. r_token.type = TK_STRING;
  336. r_token.value = str;
  337. return OK;
  338. } break;
  339. default: {
  340. if (p_str[index] <= 32) {
  341. index++;
  342. break;
  343. }
  344. if (p_str[index] == '-' || is_digit(p_str[index])) {
  345. //a number
  346. const char32_t *rptr;
  347. double number = String::to_float(&p_str[index], &rptr);
  348. index += (rptr - &p_str[index]);
  349. r_token.type = TK_NUMBER;
  350. r_token.value = number;
  351. return OK;
  352. } else if (is_ascii_alphabet_char(p_str[index])) {
  353. String id;
  354. while (is_ascii_alphabet_char(p_str[index])) {
  355. id += p_str[index];
  356. index++;
  357. }
  358. r_token.type = TK_IDENTIFIER;
  359. r_token.value = id;
  360. return OK;
  361. } else {
  362. r_err_str = "Unexpected character";
  363. return ERR_PARSE_ERROR;
  364. }
  365. }
  366. }
  367. }
  368. r_err_str = "Unknown error getting token";
  369. return ERR_PARSE_ERROR;
  370. }
  371. Error JSON::_parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str) {
  372. if (p_depth > Variant::MAX_RECURSION_DEPTH) {
  373. r_err_str = "JSON structure is too deep";
  374. return ERR_OUT_OF_MEMORY;
  375. }
  376. if (token.type == TK_CURLY_BRACKET_OPEN) {
  377. Dictionary d;
  378. Error err = _parse_object(d, p_str, index, p_len, line, p_depth + 1, r_err_str);
  379. if (err) {
  380. return err;
  381. }
  382. value = d;
  383. } else if (token.type == TK_BRACKET_OPEN) {
  384. Array a;
  385. Error err = _parse_array(a, p_str, index, p_len, line, p_depth + 1, r_err_str);
  386. if (err) {
  387. return err;
  388. }
  389. value = a;
  390. } else if (token.type == TK_IDENTIFIER) {
  391. String id = token.value;
  392. if (id == "true") {
  393. value = true;
  394. } else if (id == "false") {
  395. value = false;
  396. } else if (id == "null") {
  397. value = Variant();
  398. } else {
  399. r_err_str = vformat("Expected 'true', 'false', or 'null', got '%s'", id);
  400. return ERR_PARSE_ERROR;
  401. }
  402. } else if (token.type == TK_NUMBER) {
  403. value = token.value;
  404. } else if (token.type == TK_STRING) {
  405. value = token.value;
  406. } else {
  407. r_err_str = vformat("Expected value, got '%s'", String(tk_name[token.type]));
  408. return ERR_PARSE_ERROR;
  409. }
  410. return OK;
  411. }
  412. Error JSON::_parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str) {
  413. Token token;
  414. bool need_comma = false;
  415. while (index < p_len) {
  416. Error err = _get_token(p_str, index, p_len, token, line, r_err_str);
  417. if (err != OK) {
  418. return err;
  419. }
  420. if (token.type == TK_BRACKET_CLOSE) {
  421. return OK;
  422. }
  423. if (need_comma) {
  424. if (token.type != TK_COMMA) {
  425. r_err_str = "Expected ','";
  426. return ERR_PARSE_ERROR;
  427. } else {
  428. need_comma = false;
  429. continue;
  430. }
  431. }
  432. Variant v;
  433. err = _parse_value(v, token, p_str, index, p_len, line, p_depth, r_err_str);
  434. if (err) {
  435. return err;
  436. }
  437. array.push_back(v);
  438. need_comma = true;
  439. }
  440. r_err_str = "Expected ']'";
  441. return ERR_PARSE_ERROR;
  442. }
  443. Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, int p_depth, String &r_err_str) {
  444. bool at_key = true;
  445. String key;
  446. Token token;
  447. bool need_comma = false;
  448. while (index < p_len) {
  449. if (at_key) {
  450. Error err = _get_token(p_str, index, p_len, token, line, r_err_str);
  451. if (err != OK) {
  452. return err;
  453. }
  454. if (token.type == TK_CURLY_BRACKET_CLOSE) {
  455. return OK;
  456. }
  457. if (need_comma) {
  458. if (token.type != TK_COMMA) {
  459. r_err_str = "Expected '}' or ','";
  460. return ERR_PARSE_ERROR;
  461. } else {
  462. need_comma = false;
  463. continue;
  464. }
  465. }
  466. if (token.type != TK_STRING) {
  467. r_err_str = "Expected key";
  468. return ERR_PARSE_ERROR;
  469. }
  470. key = token.value;
  471. err = _get_token(p_str, index, p_len, token, line, r_err_str);
  472. if (err != OK) {
  473. return err;
  474. }
  475. if (token.type != TK_COLON) {
  476. r_err_str = "Expected ':'";
  477. return ERR_PARSE_ERROR;
  478. }
  479. at_key = false;
  480. } else {
  481. Error err = _get_token(p_str, index, p_len, token, line, r_err_str);
  482. if (err != OK) {
  483. return err;
  484. }
  485. Variant v;
  486. err = _parse_value(v, token, p_str, index, p_len, line, p_depth, r_err_str);
  487. if (err) {
  488. return err;
  489. }
  490. object[key] = v;
  491. need_comma = true;
  492. at_key = true;
  493. }
  494. }
  495. r_err_str = "Expected '}'";
  496. return ERR_PARSE_ERROR;
  497. }
  498. void JSON::set_data(const Variant &p_data) {
  499. data = p_data;
  500. text.clear();
  501. }
  502. Error JSON::_parse_string(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line) {
  503. const char32_t *str = p_json.ptr();
  504. int idx = 0;
  505. int len = p_json.length();
  506. Token token;
  507. r_err_line = 0;
  508. String aux_key;
  509. Error err = _get_token(str, idx, len, token, r_err_line, r_err_str);
  510. if (err) {
  511. return err;
  512. }
  513. err = _parse_value(r_ret, token, str, idx, len, r_err_line, 0, r_err_str);
  514. // Check if EOF is reached
  515. // or it's a type of the next token.
  516. if (err == OK && idx < len) {
  517. err = _get_token(str, idx, len, token, r_err_line, r_err_str);
  518. if (err || token.type != TK_EOF) {
  519. r_err_str = "Expected 'EOF'";
  520. // Reset return value to empty `Variant`
  521. r_ret = Variant();
  522. return ERR_PARSE_ERROR;
  523. }
  524. }
  525. return err;
  526. }
  527. Error JSON::parse(const String &p_json_string, bool p_keep_text) {
  528. Error err = _parse_string(p_json_string, data, err_str, err_line);
  529. if (err == Error::OK) {
  530. err_line = 0;
  531. }
  532. if (p_keep_text) {
  533. text = p_json_string;
  534. }
  535. return err;
  536. }
  537. String JSON::get_parsed_text() const {
  538. return text;
  539. }
  540. String JSON::stringify(const Variant &p_var, const String &p_indent, bool p_sort_keys, bool p_full_precision) {
  541. String result;
  542. HashSet<const void *> markers;
  543. _stringify(result, p_var, p_indent, 0, p_sort_keys, markers, p_full_precision);
  544. return result;
  545. }
  546. Variant JSON::parse_string(const String &p_json_string) {
  547. Ref<JSON> json;
  548. json.instantiate();
  549. Error error = json->parse(p_json_string);
  550. ERR_FAIL_COND_V_MSG(error != Error::OK, Variant(), vformat("Parse JSON failed. Error at line %d: %s", json->get_error_line(), json->get_error_message()));
  551. return json->get_data();
  552. }
  553. void JSON::_bind_methods() {
  554. ClassDB::bind_static_method("JSON", D_METHOD("stringify", "data", "indent", "sort_keys", "full_precision"), &JSON::stringify, DEFVAL(""), DEFVAL(true), DEFVAL(false));
  555. ClassDB::bind_static_method("JSON", D_METHOD("parse_string", "json_string"), &JSON::parse_string);
  556. ClassDB::bind_method(D_METHOD("parse", "json_text", "keep_text"), &JSON::parse, DEFVAL(false));
  557. ClassDB::bind_method(D_METHOD("get_data"), &JSON::get_data);
  558. ClassDB::bind_method(D_METHOD("set_data", "data"), &JSON::set_data);
  559. ClassDB::bind_method(D_METHOD("get_parsed_text"), &JSON::get_parsed_text);
  560. ClassDB::bind_method(D_METHOD("get_error_line"), &JSON::get_error_line);
  561. ClassDB::bind_method(D_METHOD("get_error_message"), &JSON::get_error_message);
  562. ClassDB::bind_static_method("JSON", D_METHOD("from_native", "variant", "full_objects"), &JSON::from_native, DEFVAL(false));
  563. ClassDB::bind_static_method("JSON", D_METHOD("to_native", "json", "allow_objects"), &JSON::to_native, DEFVAL(false));
  564. ADD_PROPERTY(PropertyInfo(Variant::NIL, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT), "set_data", "get_data"); // Ensures that it can be serialized as binary.
  565. }
  566. #define TYPE "type"
  567. #define ELEM_TYPE "elem_type"
  568. #define KEY_TYPE "key_type"
  569. #define VALUE_TYPE "value_type"
  570. #define ARGS "args"
  571. #define PROPS "props"
  572. static bool _encode_container_type(Dictionary &r_dict, const String &p_key, const ContainerType &p_type, bool p_full_objects) {
  573. if (p_type.builtin_type != Variant::NIL) {
  574. if (p_type.script.is_valid()) {
  575. ERR_FAIL_COND_V(!p_full_objects, false);
  576. const String path = p_type.script->get_path();
  577. ERR_FAIL_COND_V_MSG(path.is_empty() || !path.begins_with("res://"), false, "Failed to encode a path to a custom script for a container type.");
  578. r_dict[p_key] = path;
  579. } else if (p_type.class_name != StringName()) {
  580. ERR_FAIL_COND_V(!p_full_objects, false);
  581. r_dict[p_key] = String(p_type.class_name);
  582. } else {
  583. // No need to check `p_full_objects` since `class_name` should be non-empty for `builtin_type == Variant::OBJECT`.
  584. r_dict[p_key] = Variant::get_type_name(p_type.builtin_type);
  585. }
  586. }
  587. return true;
  588. }
  589. Variant JSON::_from_native(const Variant &p_variant, bool p_full_objects, int p_depth) {
  590. #define RETURN_ARGS \
  591. Dictionary ret; \
  592. ret[TYPE] = Variant::get_type_name(p_variant.get_type()); \
  593. ret[ARGS] = args; \
  594. return ret
  595. switch (p_variant.get_type()) {
  596. case Variant::NIL:
  597. case Variant::BOOL: {
  598. return p_variant;
  599. } break;
  600. case Variant::INT: {
  601. return "i:" + String(p_variant);
  602. } break;
  603. case Variant::FLOAT: {
  604. return "f:" + String(p_variant);
  605. } break;
  606. case Variant::STRING: {
  607. return "s:" + String(p_variant);
  608. } break;
  609. case Variant::STRING_NAME: {
  610. return "sn:" + String(p_variant);
  611. } break;
  612. case Variant::NODE_PATH: {
  613. return "np:" + String(p_variant);
  614. } break;
  615. case Variant::RID:
  616. case Variant::CALLABLE:
  617. case Variant::SIGNAL: {
  618. Dictionary ret;
  619. ret[TYPE] = Variant::get_type_name(p_variant.get_type());
  620. return ret;
  621. } break;
  622. case Variant::VECTOR2: {
  623. const Vector2 v = p_variant;
  624. Array args = { v.x, v.y };
  625. RETURN_ARGS;
  626. } break;
  627. case Variant::VECTOR2I: {
  628. const Vector2i v = p_variant;
  629. Array args = { v.x, v.y };
  630. RETURN_ARGS;
  631. } break;
  632. case Variant::RECT2: {
  633. const Rect2 r = p_variant;
  634. Array args = { r.position.x, r.position.y, r.size.width, r.size.height };
  635. RETURN_ARGS;
  636. } break;
  637. case Variant::RECT2I: {
  638. const Rect2i r = p_variant;
  639. Array args = { r.position.x, r.position.y, r.size.width, r.size.height };
  640. RETURN_ARGS;
  641. } break;
  642. case Variant::VECTOR3: {
  643. const Vector3 v = p_variant;
  644. Array args = { v.x, v.y, v.z };
  645. RETURN_ARGS;
  646. } break;
  647. case Variant::VECTOR3I: {
  648. const Vector3i v = p_variant;
  649. Array args = { v.x, v.y, v.z };
  650. RETURN_ARGS;
  651. } break;
  652. case Variant::TRANSFORM2D: {
  653. const Transform2D t = p_variant;
  654. Array args = { t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y };
  655. RETURN_ARGS;
  656. } break;
  657. case Variant::VECTOR4: {
  658. const Vector4 v = p_variant;
  659. Array args = { v.x, v.y, v.z, v.w };
  660. RETURN_ARGS;
  661. } break;
  662. case Variant::VECTOR4I: {
  663. const Vector4i v = p_variant;
  664. Array args = { v.x, v.y, v.z, v.w };
  665. RETURN_ARGS;
  666. } break;
  667. case Variant::PLANE: {
  668. const Plane p = p_variant;
  669. Array args = { p.normal.x, p.normal.y, p.normal.z, p.d };
  670. RETURN_ARGS;
  671. } break;
  672. case Variant::QUATERNION: {
  673. const Quaternion q = p_variant;
  674. Array args = { q.x, q.y, q.z, q.w };
  675. RETURN_ARGS;
  676. } break;
  677. case Variant::AABB: {
  678. const AABB aabb = p_variant;
  679. Array args = { aabb.position.x, aabb.position.y, aabb.position.z, aabb.size.x, aabb.size.y, aabb.size.z };
  680. RETURN_ARGS;
  681. } break;
  682. case Variant::BASIS: {
  683. const Basis b = p_variant;
  684. Array args = { b.get_column(0).x, b.get_column(0).y, b.get_column(0).z,
  685. b.get_column(1).x, b.get_column(1).y, b.get_column(1).z,
  686. b.get_column(2).x, b.get_column(2).y, b.get_column(2).z };
  687. RETURN_ARGS;
  688. } break;
  689. case Variant::TRANSFORM3D: {
  690. const Transform3D t = p_variant;
  691. Array args = { t.basis.get_column(0).x, t.basis.get_column(0).y, t.basis.get_column(0).z,
  692. t.basis.get_column(1).x, t.basis.get_column(1).y, t.basis.get_column(1).z,
  693. t.basis.get_column(2).x, t.basis.get_column(2).y, t.basis.get_column(2).z,
  694. t.origin.x, t.origin.y, t.origin.z };
  695. RETURN_ARGS;
  696. } break;
  697. case Variant::PROJECTION: {
  698. const Projection p = p_variant;
  699. Array args = { p[0].x, p[0].y, p[0].z, p[0].w,
  700. p[1].x, p[1].y, p[1].z, p[1].w,
  701. p[2].x, p[2].y, p[2].z, p[2].w,
  702. p[3].x, p[3].y, p[3].z, p[3].w };
  703. RETURN_ARGS;
  704. } break;
  705. case Variant::COLOR: {
  706. const Color c = p_variant;
  707. Array args = { c.r, c.g, c.b, c.a };
  708. RETURN_ARGS;
  709. } break;
  710. case Variant::OBJECT: {
  711. ERR_FAIL_COND_V(!p_full_objects, Variant());
  712. ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, Variant(), "Variant is too deep. Bailing.");
  713. const Object *obj = p_variant.get_validated_object();
  714. if (obj == nullptr) {
  715. return Variant();
  716. }
  717. ERR_FAIL_COND_V(!ClassDB::can_instantiate(obj->get_class()), Variant());
  718. List<PropertyInfo> prop_list;
  719. obj->get_property_list(&prop_list);
  720. Array props;
  721. for (const PropertyInfo &pi : prop_list) {
  722. if (!(pi.usage & PROPERTY_USAGE_STORAGE)) {
  723. continue;
  724. }
  725. Variant value;
  726. if (pi.name == CoreStringName(script)) {
  727. const Ref<Script> script = obj->get_script();
  728. if (script.is_valid()) {
  729. const String path = script->get_path();
  730. ERR_FAIL_COND_V_MSG(path.is_empty() || !path.begins_with("res://"), Variant(), "Failed to encode a path to a custom script.");
  731. value = path;
  732. }
  733. } else {
  734. value = obj->get(pi.name);
  735. }
  736. props.push_back(pi.name);
  737. props.push_back(_from_native(value, p_full_objects, p_depth + 1));
  738. }
  739. Dictionary ret;
  740. ret[TYPE] = obj->get_class();
  741. ret[PROPS] = props;
  742. return ret;
  743. } break;
  744. case Variant::DICTIONARY: {
  745. const Dictionary dict = p_variant;
  746. Array args;
  747. Dictionary ret;
  748. ret[TYPE] = Variant::get_type_name(p_variant.get_type());
  749. if (!_encode_container_type(ret, KEY_TYPE, dict.get_key_type(), p_full_objects)) {
  750. return Variant();
  751. }
  752. if (!_encode_container_type(ret, VALUE_TYPE, dict.get_value_type(), p_full_objects)) {
  753. return Variant();
  754. }
  755. ret[ARGS] = args;
  756. ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, ret, "Variant is too deep. Bailing.");
  757. for (const KeyValue<Variant, Variant> &kv : dict) {
  758. args.push_back(_from_native(kv.key, p_full_objects, p_depth + 1));
  759. args.push_back(_from_native(kv.value, p_full_objects, p_depth + 1));
  760. }
  761. return ret;
  762. } break;
  763. case Variant::ARRAY: {
  764. const Array arr = p_variant;
  765. Variant ret;
  766. Array args;
  767. if (arr.is_typed()) {
  768. Dictionary d;
  769. d[TYPE] = Variant::get_type_name(p_variant.get_type());
  770. if (!_encode_container_type(d, ELEM_TYPE, arr.get_element_type(), p_full_objects)) {
  771. return Variant();
  772. }
  773. d[ARGS] = args;
  774. ret = d;
  775. } else {
  776. ret = args;
  777. }
  778. ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, ret, "Variant is too deep. Bailing.");
  779. for (int i = 0; i < arr.size(); i++) {
  780. args.push_back(_from_native(arr[i], p_full_objects, p_depth + 1));
  781. }
  782. return ret;
  783. } break;
  784. case Variant::PACKED_BYTE_ARRAY: {
  785. const PackedByteArray arr = p_variant;
  786. Array args;
  787. for (int i = 0; i < arr.size(); i++) {
  788. args.push_back(arr[i]);
  789. }
  790. RETURN_ARGS;
  791. } break;
  792. case Variant::PACKED_INT32_ARRAY: {
  793. const PackedInt32Array arr = p_variant;
  794. Array args;
  795. for (int i = 0; i < arr.size(); i++) {
  796. args.push_back(arr[i]);
  797. }
  798. RETURN_ARGS;
  799. } break;
  800. case Variant::PACKED_INT64_ARRAY: {
  801. const PackedInt64Array arr = p_variant;
  802. Array args;
  803. for (int i = 0; i < arr.size(); i++) {
  804. args.push_back(arr[i]);
  805. }
  806. RETURN_ARGS;
  807. } break;
  808. case Variant::PACKED_FLOAT32_ARRAY: {
  809. const PackedFloat32Array arr = p_variant;
  810. Array args;
  811. for (int i = 0; i < arr.size(); i++) {
  812. args.push_back(arr[i]);
  813. }
  814. RETURN_ARGS;
  815. } break;
  816. case Variant::PACKED_FLOAT64_ARRAY: {
  817. const PackedFloat64Array arr = p_variant;
  818. Array args;
  819. for (int i = 0; i < arr.size(); i++) {
  820. args.push_back(arr[i]);
  821. }
  822. RETURN_ARGS;
  823. } break;
  824. case Variant::PACKED_STRING_ARRAY: {
  825. const PackedStringArray arr = p_variant;
  826. Array args;
  827. for (int i = 0; i < arr.size(); i++) {
  828. args.push_back(arr[i]);
  829. }
  830. RETURN_ARGS;
  831. } break;
  832. case Variant::PACKED_VECTOR2_ARRAY: {
  833. const PackedVector2Array arr = p_variant;
  834. Array args;
  835. for (int i = 0; i < arr.size(); i++) {
  836. Vector2 v = arr[i];
  837. args.push_back(v.x);
  838. args.push_back(v.y);
  839. }
  840. RETURN_ARGS;
  841. } break;
  842. case Variant::PACKED_VECTOR3_ARRAY: {
  843. const PackedVector3Array arr = p_variant;
  844. Array args;
  845. for (int i = 0; i < arr.size(); i++) {
  846. Vector3 v = arr[i];
  847. args.push_back(v.x);
  848. args.push_back(v.y);
  849. args.push_back(v.z);
  850. }
  851. RETURN_ARGS;
  852. } break;
  853. case Variant::PACKED_COLOR_ARRAY: {
  854. const PackedColorArray arr = p_variant;
  855. Array args;
  856. for (int i = 0; i < arr.size(); i++) {
  857. Color v = arr[i];
  858. args.push_back(v.r);
  859. args.push_back(v.g);
  860. args.push_back(v.b);
  861. args.push_back(v.a);
  862. }
  863. RETURN_ARGS;
  864. } break;
  865. case Variant::PACKED_VECTOR4_ARRAY: {
  866. const PackedVector4Array arr = p_variant;
  867. Array args;
  868. for (int i = 0; i < arr.size(); i++) {
  869. Vector4 v = arr[i];
  870. args.push_back(v.x);
  871. args.push_back(v.y);
  872. args.push_back(v.z);
  873. args.push_back(v.w);
  874. }
  875. RETURN_ARGS;
  876. } break;
  877. case Variant::VARIANT_MAX: {
  878. // Nothing to do.
  879. } break;
  880. }
  881. #undef RETURN_ARGS
  882. ERR_FAIL_V_MSG(Variant(), vformat(R"(Unhandled Variant type "%s".)", Variant::get_type_name(p_variant.get_type())));
  883. }
  884. static bool _decode_container_type(const Dictionary &p_dict, const String &p_key, ContainerType &r_type, bool p_allow_objects) {
  885. if (!p_dict.has(p_key)) {
  886. return true;
  887. }
  888. const String type_name = p_dict[p_key];
  889. const Variant::Type builtin_type = Variant::get_type_by_name(type_name);
  890. if (builtin_type < Variant::VARIANT_MAX && builtin_type != Variant::OBJECT) {
  891. r_type.builtin_type = builtin_type;
  892. return true;
  893. }
  894. if (ClassDB::class_exists(type_name)) {
  895. ERR_FAIL_COND_V(!p_allow_objects, false);
  896. r_type.builtin_type = Variant::OBJECT;
  897. r_type.class_name = type_name;
  898. return true;
  899. }
  900. if (type_name.begins_with("res://")) {
  901. ERR_FAIL_COND_V(!p_allow_objects, false);
  902. ERR_FAIL_COND_V_MSG(!ResourceLoader::exists(type_name, "Script"), false, vformat(R"(Invalid script path "%s".)", type_name));
  903. const Ref<Script> script = ResourceLoader::load(type_name, "Script");
  904. ERR_FAIL_COND_V_MSG(script.is_null(), false, vformat(R"(Can't load script at path "%s".)", type_name));
  905. r_type.builtin_type = Variant::OBJECT;
  906. r_type.class_name = script->get_instance_base_type();
  907. r_type.script = script;
  908. return true;
  909. }
  910. ERR_FAIL_V_MSG(false, vformat(R"(Invalid type "%s".)", type_name));
  911. }
  912. Variant JSON::_to_native(const Variant &p_json, bool p_allow_objects, int p_depth) {
  913. switch (p_json.get_type()) {
  914. case Variant::NIL:
  915. case Variant::BOOL: {
  916. return p_json;
  917. } break;
  918. case Variant::STRING: {
  919. const String s = p_json;
  920. if (s.begins_with("i:")) {
  921. return s.substr(2).to_int();
  922. } else if (s.begins_with("f:")) {
  923. return s.substr(2).to_float();
  924. } else if (s.begins_with("s:")) {
  925. return s.substr(2);
  926. } else if (s.begins_with("sn:")) {
  927. return StringName(s.substr(3));
  928. } else if (s.begins_with("np:")) {
  929. return NodePath(s.substr(3));
  930. }
  931. ERR_FAIL_V_MSG(Variant(), "Invalid string, the type prefix is not recognized.");
  932. } break;
  933. case Variant::DICTIONARY: {
  934. const Dictionary dict = p_json;
  935. ERR_FAIL_COND_V(!dict.has(TYPE), Variant());
  936. #define LOAD_ARGS() \
  937. ERR_FAIL_COND_V(!dict.has(ARGS), Variant()); \
  938. const Array args = dict[ARGS]
  939. #define LOAD_ARGS_CHECK_SIZE(m_size) \
  940. ERR_FAIL_COND_V(!dict.has(ARGS), Variant()); \
  941. const Array args = dict[ARGS]; \
  942. ERR_FAIL_COND_V(args.size() != (m_size), Variant())
  943. #define LOAD_ARGS_CHECK_FACTOR(m_factor) \
  944. ERR_FAIL_COND_V(!dict.has(ARGS), Variant()); \
  945. const Array args = dict[ARGS]; \
  946. ERR_FAIL_COND_V(args.size() % (m_factor) != 0, Variant())
  947. switch (Variant::get_type_by_name(dict[TYPE])) {
  948. case Variant::NIL:
  949. case Variant::BOOL: {
  950. ERR_FAIL_V_MSG(Variant(), vformat(R"(Unexpected "%s": Variant type "%s" is JSON-compliant.)", TYPE, dict[TYPE]));
  951. } break;
  952. case Variant::INT:
  953. case Variant::FLOAT:
  954. case Variant::STRING:
  955. case Variant::STRING_NAME:
  956. case Variant::NODE_PATH: {
  957. ERR_FAIL_V_MSG(Variant(), vformat(R"(Unexpected "%s": Variant type "%s" must be represented as a string.)", TYPE, dict[TYPE]));
  958. } break;
  959. case Variant::RID: {
  960. return RID();
  961. } break;
  962. case Variant::CALLABLE: {
  963. return Callable();
  964. } break;
  965. case Variant::SIGNAL: {
  966. return Signal();
  967. } break;
  968. case Variant::VECTOR2: {
  969. LOAD_ARGS_CHECK_SIZE(2);
  970. Vector2 v;
  971. v.x = args[0];
  972. v.y = args[1];
  973. return v;
  974. } break;
  975. case Variant::VECTOR2I: {
  976. LOAD_ARGS_CHECK_SIZE(2);
  977. Vector2i v;
  978. v.x = args[0];
  979. v.y = args[1];
  980. return v;
  981. } break;
  982. case Variant::RECT2: {
  983. LOAD_ARGS_CHECK_SIZE(4);
  984. Rect2 r;
  985. r.position = Point2(args[0], args[1]);
  986. r.size = Size2(args[2], args[3]);
  987. return r;
  988. } break;
  989. case Variant::RECT2I: {
  990. LOAD_ARGS_CHECK_SIZE(4);
  991. Rect2i r;
  992. r.position = Point2i(args[0], args[1]);
  993. r.size = Size2i(args[2], args[3]);
  994. return r;
  995. } break;
  996. case Variant::VECTOR3: {
  997. LOAD_ARGS_CHECK_SIZE(3);
  998. Vector3 v;
  999. v.x = args[0];
  1000. v.y = args[1];
  1001. v.z = args[2];
  1002. return v;
  1003. } break;
  1004. case Variant::VECTOR3I: {
  1005. LOAD_ARGS_CHECK_SIZE(3);
  1006. Vector3i v;
  1007. v.x = args[0];
  1008. v.y = args[1];
  1009. v.z = args[2];
  1010. return v;
  1011. } break;
  1012. case Variant::TRANSFORM2D: {
  1013. LOAD_ARGS_CHECK_SIZE(6);
  1014. Transform2D t;
  1015. t[0] = Vector2(args[0], args[1]);
  1016. t[1] = Vector2(args[2], args[3]);
  1017. t[2] = Vector2(args[4], args[5]);
  1018. return t;
  1019. } break;
  1020. case Variant::VECTOR4: {
  1021. LOAD_ARGS_CHECK_SIZE(4);
  1022. Vector4 v;
  1023. v.x = args[0];
  1024. v.y = args[1];
  1025. v.z = args[2];
  1026. v.w = args[3];
  1027. return v;
  1028. } break;
  1029. case Variant::VECTOR4I: {
  1030. LOAD_ARGS_CHECK_SIZE(4);
  1031. Vector4i v;
  1032. v.x = args[0];
  1033. v.y = args[1];
  1034. v.z = args[2];
  1035. v.w = args[3];
  1036. return v;
  1037. } break;
  1038. case Variant::PLANE: {
  1039. LOAD_ARGS_CHECK_SIZE(4);
  1040. Plane p;
  1041. p.normal = Vector3(args[0], args[1], args[2]);
  1042. p.d = args[3];
  1043. return p;
  1044. } break;
  1045. case Variant::QUATERNION: {
  1046. LOAD_ARGS_CHECK_SIZE(4);
  1047. Quaternion q;
  1048. q.x = args[0];
  1049. q.y = args[1];
  1050. q.z = args[2];
  1051. q.w = args[3];
  1052. return q;
  1053. } break;
  1054. case Variant::AABB: {
  1055. LOAD_ARGS_CHECK_SIZE(6);
  1056. AABB aabb;
  1057. aabb.position = Vector3(args[0], args[1], args[2]);
  1058. aabb.size = Vector3(args[3], args[4], args[5]);
  1059. return aabb;
  1060. } break;
  1061. case Variant::BASIS: {
  1062. LOAD_ARGS_CHECK_SIZE(9);
  1063. Basis b;
  1064. b.set_column(0, Vector3(args[0], args[1], args[2]));
  1065. b.set_column(1, Vector3(args[3], args[4], args[5]));
  1066. b.set_column(2, Vector3(args[6], args[7], args[8]));
  1067. return b;
  1068. } break;
  1069. case Variant::TRANSFORM3D: {
  1070. LOAD_ARGS_CHECK_SIZE(12);
  1071. Transform3D t;
  1072. t.basis.set_column(0, Vector3(args[0], args[1], args[2]));
  1073. t.basis.set_column(1, Vector3(args[3], args[4], args[5]));
  1074. t.basis.set_column(2, Vector3(args[6], args[7], args[8]));
  1075. t.origin = Vector3(args[9], args[10], args[11]);
  1076. return t;
  1077. } break;
  1078. case Variant::PROJECTION: {
  1079. LOAD_ARGS_CHECK_SIZE(16);
  1080. Projection p;
  1081. p[0] = Vector4(args[0], args[1], args[2], args[3]);
  1082. p[1] = Vector4(args[4], args[5], args[6], args[7]);
  1083. p[2] = Vector4(args[8], args[9], args[10], args[11]);
  1084. p[3] = Vector4(args[12], args[13], args[14], args[15]);
  1085. return p;
  1086. } break;
  1087. case Variant::COLOR: {
  1088. LOAD_ARGS_CHECK_SIZE(4);
  1089. Color c;
  1090. c.r = args[0];
  1091. c.g = args[1];
  1092. c.b = args[2];
  1093. c.a = args[3];
  1094. return c;
  1095. } break;
  1096. case Variant::OBJECT: {
  1097. // Nothing to do at this stage. `Object` should be treated as a class, not as a built-in type.
  1098. } break;
  1099. case Variant::DICTIONARY: {
  1100. LOAD_ARGS_CHECK_FACTOR(2);
  1101. ContainerType key_type;
  1102. if (!_decode_container_type(dict, KEY_TYPE, key_type, p_allow_objects)) {
  1103. return Variant();
  1104. }
  1105. ContainerType value_type;
  1106. if (!_decode_container_type(dict, VALUE_TYPE, value_type, p_allow_objects)) {
  1107. return Variant();
  1108. }
  1109. Dictionary ret;
  1110. if (key_type.builtin_type != Variant::NIL || value_type.builtin_type != Variant::NIL) {
  1111. ret.set_typed(key_type, value_type);
  1112. }
  1113. ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, ret, "Variant is too deep. Bailing.");
  1114. for (int i = 0; i < args.size() / 2; i++) {
  1115. ret[_to_native(args[i * 2 + 0], p_allow_objects, p_depth + 1)] = _to_native(args[i * 2 + 1], p_allow_objects, p_depth + 1);
  1116. }
  1117. return ret;
  1118. } break;
  1119. case Variant::ARRAY: {
  1120. LOAD_ARGS();
  1121. ContainerType elem_type;
  1122. if (!_decode_container_type(dict, ELEM_TYPE, elem_type, p_allow_objects)) {
  1123. return Variant();
  1124. }
  1125. Array ret;
  1126. if (elem_type.builtin_type != Variant::NIL) {
  1127. ret.set_typed(elem_type);
  1128. }
  1129. ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, ret, "Variant is too deep. Bailing.");
  1130. ret.resize(args.size());
  1131. for (int i = 0; i < args.size(); i++) {
  1132. ret[i] = _to_native(args[i], p_allow_objects, p_depth + 1);
  1133. }
  1134. return ret;
  1135. } break;
  1136. case Variant::PACKED_BYTE_ARRAY: {
  1137. LOAD_ARGS();
  1138. PackedByteArray arr;
  1139. arr.resize(args.size());
  1140. for (int i = 0; i < arr.size(); i++) {
  1141. arr.write[i] = args[i];
  1142. }
  1143. return arr;
  1144. } break;
  1145. case Variant::PACKED_INT32_ARRAY: {
  1146. LOAD_ARGS();
  1147. PackedInt32Array arr;
  1148. arr.resize(args.size());
  1149. for (int i = 0; i < arr.size(); i++) {
  1150. arr.write[i] = args[i];
  1151. }
  1152. return arr;
  1153. } break;
  1154. case Variant::PACKED_INT64_ARRAY: {
  1155. LOAD_ARGS();
  1156. PackedInt64Array arr;
  1157. arr.resize(args.size());
  1158. for (int i = 0; i < arr.size(); i++) {
  1159. arr.write[i] = args[i];
  1160. }
  1161. return arr;
  1162. } break;
  1163. case Variant::PACKED_FLOAT32_ARRAY: {
  1164. LOAD_ARGS();
  1165. PackedFloat32Array arr;
  1166. arr.resize(args.size());
  1167. for (int i = 0; i < arr.size(); i++) {
  1168. arr.write[i] = args[i];
  1169. }
  1170. return arr;
  1171. } break;
  1172. case Variant::PACKED_FLOAT64_ARRAY: {
  1173. LOAD_ARGS();
  1174. PackedFloat64Array arr;
  1175. arr.resize(args.size());
  1176. for (int i = 0; i < arr.size(); i++) {
  1177. arr.write[i] = args[i];
  1178. }
  1179. return arr;
  1180. } break;
  1181. case Variant::PACKED_STRING_ARRAY: {
  1182. LOAD_ARGS();
  1183. PackedStringArray arr;
  1184. arr.resize(args.size());
  1185. for (int i = 0; i < arr.size(); i++) {
  1186. arr.write[i] = args[i];
  1187. }
  1188. return arr;
  1189. } break;
  1190. case Variant::PACKED_VECTOR2_ARRAY: {
  1191. LOAD_ARGS_CHECK_FACTOR(2);
  1192. PackedVector2Array arr;
  1193. arr.resize(args.size() / 2);
  1194. for (int i = 0; i < arr.size(); i++) {
  1195. arr.write[i] = Vector2(args[i * 2 + 0], args[i * 2 + 1]);
  1196. }
  1197. return arr;
  1198. } break;
  1199. case Variant::PACKED_VECTOR3_ARRAY: {
  1200. LOAD_ARGS_CHECK_FACTOR(3);
  1201. PackedVector3Array arr;
  1202. arr.resize(args.size() / 3);
  1203. for (int i = 0; i < arr.size(); i++) {
  1204. arr.write[i] = Vector3(args[i * 3 + 0], args[i * 3 + 1], args[i * 3 + 2]);
  1205. }
  1206. return arr;
  1207. } break;
  1208. case Variant::PACKED_COLOR_ARRAY: {
  1209. LOAD_ARGS_CHECK_FACTOR(4);
  1210. PackedColorArray arr;
  1211. arr.resize(args.size() / 4);
  1212. for (int i = 0; i < arr.size(); i++) {
  1213. arr.write[i] = Color(args[i * 4 + 0], args[i * 4 + 1], args[i * 4 + 2], args[i * 4 + 3]);
  1214. }
  1215. return arr;
  1216. } break;
  1217. case Variant::PACKED_VECTOR4_ARRAY: {
  1218. LOAD_ARGS_CHECK_FACTOR(4);
  1219. PackedVector4Array arr;
  1220. arr.resize(args.size() / 4);
  1221. for (int i = 0; i < arr.size(); i++) {
  1222. arr.write[i] = Vector4(args[i * 4 + 0], args[i * 4 + 1], args[i * 4 + 2], args[i * 4 + 3]);
  1223. }
  1224. return arr;
  1225. } break;
  1226. case Variant::VARIANT_MAX: {
  1227. // Nothing to do.
  1228. } break;
  1229. }
  1230. #undef LOAD_ARGS
  1231. #undef LOAD_ARGS_CHECK_SIZE
  1232. #undef LOAD_ARGS_CHECK_FACTOR
  1233. if (ClassDB::class_exists(dict[TYPE])) {
  1234. ERR_FAIL_COND_V(!p_allow_objects, Variant());
  1235. ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, Variant(), "Variant is too deep. Bailing.");
  1236. ERR_FAIL_COND_V(!dict.has(PROPS), Variant());
  1237. const Array props = dict[PROPS];
  1238. ERR_FAIL_COND_V(props.size() % 2 != 0, Variant());
  1239. ERR_FAIL_COND_V(!ClassDB::can_instantiate(dict[TYPE]), Variant());
  1240. Object *obj = ClassDB::instantiate(dict[TYPE]);
  1241. ERR_FAIL_NULL_V(obj, Variant());
  1242. // Avoid premature free `RefCounted`. This must be done before properties are initialized,
  1243. // since script functions (setters, implicit initializer) may be called. See GH-68666.
  1244. Variant variant;
  1245. if (Object::cast_to<RefCounted>(obj)) {
  1246. const Ref<RefCounted> ref = Ref<RefCounted>(Object::cast_to<RefCounted>(obj));
  1247. variant = ref;
  1248. } else {
  1249. variant = obj;
  1250. }
  1251. for (int i = 0; i < props.size() / 2; i++) {
  1252. const StringName name = props[i * 2 + 0];
  1253. const Variant value = _to_native(props[i * 2 + 1], p_allow_objects, p_depth + 1);
  1254. if (name == CoreStringName(script) && value.get_type() != Variant::NIL) {
  1255. const String path = value;
  1256. ERR_FAIL_COND_V_MSG(path.is_empty() || !path.begins_with("res://") || !ResourceLoader::exists(path, "Script"),
  1257. Variant(),
  1258. vformat(R"(Invalid script path "%s".)", path));
  1259. const Ref<Script> script = ResourceLoader::load(path, "Script");
  1260. ERR_FAIL_COND_V_MSG(script.is_null(), Variant(), vformat(R"(Can't load script at path "%s".)", path));
  1261. obj->set_script(script);
  1262. } else {
  1263. obj->set(name, value);
  1264. }
  1265. }
  1266. return variant;
  1267. }
  1268. ERR_FAIL_V_MSG(Variant(), vformat(R"(Invalid type "%s".)", dict[TYPE]));
  1269. } break;
  1270. case Variant::ARRAY: {
  1271. ERR_FAIL_COND_V_MSG(p_depth > Variant::MAX_RECURSION_DEPTH, Array(), "Variant is too deep. Bailing.");
  1272. const Array arr = p_json;
  1273. Array ret;
  1274. ret.resize(arr.size());
  1275. for (int i = 0; i < arr.size(); i++) {
  1276. ret[i] = _to_native(arr[i], p_allow_objects, p_depth + 1);
  1277. }
  1278. return ret;
  1279. } break;
  1280. default: {
  1281. // Nothing to do.
  1282. } break;
  1283. }
  1284. ERR_FAIL_V_MSG(Variant(), vformat(R"(Variant type "%s" is not JSON-compliant.)", Variant::get_type_name(p_json.get_type())));
  1285. }
  1286. #undef TYPE
  1287. #undef ELEM_TYPE
  1288. #undef KEY_TYPE
  1289. #undef VALUE_TYPE
  1290. #undef ARGS
  1291. #undef PROPS
  1292. ////////////
  1293. Ref<Resource> ResourceFormatLoaderJSON::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) {
  1294. if (r_error) {
  1295. *r_error = ERR_FILE_CANT_OPEN;
  1296. }
  1297. if (!FileAccess::exists(p_path)) {
  1298. *r_error = ERR_FILE_NOT_FOUND;
  1299. return Ref<Resource>();
  1300. }
  1301. Ref<JSON> json;
  1302. json.instantiate();
  1303. Error err = json->parse(FileAccess::get_file_as_string(p_path), Engine::get_singleton()->is_editor_hint());
  1304. if (err != OK) {
  1305. String err_text = "Error parsing JSON file at '" + p_path + "', on line " + itos(json->get_error_line()) + ": " + json->get_error_message();
  1306. if (Engine::get_singleton()->is_editor_hint()) {
  1307. // If running on editor, still allow opening the JSON so the code editor can edit it.
  1308. WARN_PRINT(err_text);
  1309. } else {
  1310. if (r_error) {
  1311. *r_error = err;
  1312. }
  1313. ERR_PRINT(err_text);
  1314. return Ref<Resource>();
  1315. }
  1316. }
  1317. if (r_error) {
  1318. *r_error = OK;
  1319. }
  1320. return json;
  1321. }
  1322. void ResourceFormatLoaderJSON::get_recognized_extensions(List<String> *p_extensions) const {
  1323. p_extensions->push_back("json");
  1324. }
  1325. bool ResourceFormatLoaderJSON::handles_type(const String &p_type) const {
  1326. return (p_type == "JSON");
  1327. }
  1328. String ResourceFormatLoaderJSON::get_resource_type(const String &p_path) const {
  1329. String el = p_path.get_extension().to_lower();
  1330. if (el == "json") {
  1331. return "JSON";
  1332. }
  1333. return "";
  1334. }
  1335. Error ResourceFormatSaverJSON::save(const Ref<Resource> &p_resource, const String &p_path, uint32_t p_flags) {
  1336. Ref<JSON> json = p_resource;
  1337. ERR_FAIL_COND_V(json.is_null(), ERR_INVALID_PARAMETER);
  1338. String source = json->get_parsed_text().is_empty() ? JSON::stringify(json->get_data(), "\t", false, true) : json->get_parsed_text();
  1339. Error err;
  1340. Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::WRITE, &err);
  1341. ERR_FAIL_COND_V_MSG(err, err, vformat("Cannot save json '%s'.", p_path));
  1342. file->store_string(source);
  1343. if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) {
  1344. return ERR_CANT_CREATE;
  1345. }
  1346. return OK;
  1347. }
  1348. void ResourceFormatSaverJSON::get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const {
  1349. Ref<JSON> json = p_resource;
  1350. if (json.is_valid()) {
  1351. p_extensions->push_back("json");
  1352. }
  1353. }
  1354. bool ResourceFormatSaverJSON::recognize(const Ref<Resource> &p_resource) const {
  1355. return p_resource->get_class_name() == "JSON"; //only json, not inherited
  1356. }