{"_id":"com.xmobitea.changx.mini-json","_rev":"26-7afc6c0c1a26637fa433f8a3fce8c23d","name":"com.xmobitea.changx.mini-json","dist-tags":{"latest":"1.5.2"},"versions":{"1.3.6":{"name":"com.xmobitea.changx.mini-json","version":"1.3.6","keywords":["chang x","changx","xmobitea"],"author":{"url":"https://xmobitea.com","name":"Chang X","email":"changx.develop@gmail.com"},"license":"ISC","_id":"com.xmobitea.changx.mini-json@1.3.6","maintainers":[{"name":"changx","email":"changx.develop@gmail.com"}],"dist":{"shasum":"7c5617e81558fbc4a8d5d76d1516e5ec410ae7d2","tarball":"https://registry.npmjs.org/com.xmobitea.changx.mini-json/-/com.xmobitea.changx.mini-json-1.3.6.tgz","fileCount":21,"integrity":"sha512-hxUvJWycMMtoik+cMegA/hFiWF77pXwIruF/VG5CDkFrgxDgl5xc9hbiNzExoKFnRpyAtlhks8OE3uBEuy2CvQ==","signatures":[{"sig":"MEYCIQCnjzJF1NeqWCVdtaTzwfQQVF9L3OkOibjqbK585yC4FwIhAIr6Uct0HoNBNpttFbE38cw/0WLfN66Deczwc5jladfG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":44106,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJim35OACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNnw/9HR4YzkEPz29IDTj+QjaMPNMZ4Dl+xZtRmsEvjeMgzUduxGFX\r\nC70I88C/oKaP10cp9B85ntYBz9S/2Q6ujCX1CMoSMeV5hThgRbyAZtvcrflH\r\nMxZ16psUrlugln4b9QCXYULJVkLg3omacHsqRxEuJkutSO0f9OQc6Alx/TVV\r\ns9Z7TbHRsDFnjxhTq75hsjXHLUCkVI0fFVkh38XeUbym3wGM8SEEeDmIk3Mz\r\ncKZEA3Vj2mV8IUcKFXSefd5lPRT1Kpd700VvH12pguxI/c+Ool6SwZNcOorq\r\npcQ2s8u1CPeDPcy5qLpTKznhPMnlxt1qNdcPSFwZUQO3F0zT5AoyfHqk9cew\r\nLvpL14JDNQe2ubTo4JR6sDOMgdRvnacLcM1cXoZQy0Y66kBG1kLQZnLl9iMZ\r\n4lc6gA72yL2PFcpzxjPuTTnvIoMNMJOe+DBNo0ZN/8dKFHyD0sJUZQkBX7aB\r\n2ndY3r1gk8QbSTkDPEo57wATkxoZhf5q8s+//+svBSzxxTuFQPczE80PMUBf\r\nnLsGAinMg3iY71kaLJUsl3AD9YhuN/sY5yavYrKf7ktS+pNKCyDp6DrWSjn6\r\n2WtSqQxAfx3pP7clbEWTolBDbtGrgE/2E2ORLYK323tM7K963IGsBSkg4KG9\r\nOLN4mEPh4ooFHrrcPOrvVYrCYZhcJkhXXi4=\r\n=dMLl\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","unity":"2020.3","gitHead":"dde3c2bbc82850bc5e5519fcb5de9a8414619166","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"changx","email":"changx.develop@gmail.com"},"_npmVersion":"8.5.5","description":"XmobiTea plugins","directories":{},"displayName":"XmobiTea Json","_nodeVersion":"16.15.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/com.xmobitea.changx.mini-json_1.3.6_1654357582739_0.3425091972461425","host":"s3://npm-registry-packages"}},"1.3.8":{"name":"com.xmobitea.changx.mini-json","version":"1.3.8","keywords":["chang x","changx","xmobitea"],"author":{"url":"https://xmobitea.com","name":"Chang X","email":"changx.develop@gmail.com"},"license":"ISC","_id":"com.xmobitea.changx.mini-json@1.3.8","maintainers":[{"name":"changx","email":"changx.develop@gmail.com"}],"dist":{"shasum":"3ae2d3ec8b392d6c4660d42b2f79516ac2612661","tarball":"https://registry.npmjs.org/com.xmobitea.changx.mini-json/-/com.xmobitea.changx.mini-json-1.3.8.tgz","fileCount":21,"integrity":"sha512-IH3SJtk/44qyMQhb3+ahS3LYatA7ulgAO1FNUzAf+Hzp6AjoDHftjgDJ2RNxF43LtwB5/9/TPnU+PSwACEKUzg==","signatures":[{"sig":"MEYCIQCs2LKlCQo7XMgTB1x4KipJjGfPEXR2WJTFgsDVmzTF5wIhAMiANulW0ZY3fRLgas4J1VyHhcPjlIrYlylt8ADR9tti","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":44249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJincoLACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrnzQ/9GG1cS9AKuiz2CAiQ8DAyBVQRNn2h0ftCuSmX8Q5veUpXiSYd\r\n/sXEFaaq3lSUjj1b724Qz2H/950NkNjjDHfUUK8v+egZGXowfdEa/0CDSW+L\r\natgbE/j7pBHx0zWfGoxvkgKXo+R/nU96zsPUJt/wYGRHX6u0PsnYygP99JcP\r\nIv9reOfFIVoRspzDgLkHoFbVIrDXAWCzN+cR7Arqjd+KlHJ5JnXSbDWqVpa2\r\n8WpkSiz9NvGAHwwXNthjeVm2A8asQJV8q1HhPPQ8WffC7RV92HaeKZ8Yt5bS\r\nbD31TcsHvsGBMs8ozbTAb0PxizNKbl6R0rClNiVN/9/bZlj4YeQ6xmDhFCFb\r\ncbU9qitjSnKyuOHYnzSvDzV0aFdhZoOoN9H0ZxDSAQ25S2fgMlbeahA5Qwrq\r\nssfrLyKrBKOtRI7pak/g5BdY3pSN7hPx/GwyDyYxPDJhNC+Tsf4ztgKegswQ\r\ncSRWg2zS6syIbs3EZs6199xeOIKx4JkTs0ugR5tL6njGOXv82ZoloXEIdtG3\r\n4gDG0sQe+jjYwFA1QY9y1+woaI2jucHuYOJcx5I3vMR4aoOid8282bIOQPe7\r\nAvRHTefDYDLzmZl9PLJWddTuJcuhvgKa4gipmD9fw5T5VCVYdNReTy/v2qjw\r\nynXgYs3AjO3ZiP+Z10gHzEN8M42K/OstuwE=\r\n=RZ81\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","unity":"2020.3","gitHead":"ecde3b303102d5cb1bd036353f7ed1fc8c8c6f3d","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"changx","email":"changx.develop@gmail.com"},"_npmVersion":"8.1.0","description":"XmobiTea Unity package","directories":{},"displayName":"XmobiTea Json","_nodeVersion":"16.13.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/com.xmobitea.changx.mini-json_1.3.8_1654508043328_0.7923648898393842","host":"s3://npm-registry-packages"}},"1.3.9":{"name":"com.xmobitea.changx.mini-json","version":"1.3.9","keywords":["chang x","changx","xmobitea"],"author":{"url":"https://xmobitea.com","name":"Chang X","email":"changx.develop@gmail.com"},"license":"ISC","_id":"com.xmobitea.changx.mini-json@1.3.9","maintainers":[{"name":"changx","email":"changx.develop@gmail.com"}],"dist":{"shasum":"a8ea1b5c7c6f50b911efbf25ad6056d88595a46f","tarball":"https://registry.npmjs.org/com.xmobitea.changx.mini-json/-/com.xmobitea.changx.mini-json-1.3.9.tgz","fileCount":21,"integrity":"sha512-h/32vkXPa2+H+0IBKp2cfkdB05OYEr0A7a2zB3oLaRjtubGX1pFH55L5HSVoosWCcCDhvu6ozExnjHknreu0QA==","signatures":[{"sig":"MEUCIQCUeum4i45+Riyjwod73EacDaR4whGQDtUC30pbqHPWDQIgbgrqMzXaMnlsGHuXR4XrB6HOHv7XT+TwjlqN7bq9M1Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46007,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJioBCyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqLSw/+IWEuqekqCxrlleImnAjF/7h/8IefQRDYWvh78QwCbz6aoFHD\r\nyZpiCCnn1uhzIdu4RyzE5+4+0K3yBaiDY5SaxJrOTv0IP3WmxtdgK8UDYZbJ\r\n9YXPiRFTxkA7eNGKCFzmaWuRa2ah0GEIzu/g86qz7bx0P7zwupeqw7IphQCD\r\nRgD2Z2et7SFrJtWwDwI5Vw/dtHHguro94yOLvhlldBMMQsekK9+4tMopBe5S\r\nJxZ/ga3OwefRU8an4MeuywCflk6cS5w2trppml3Yxe9TY1NkmKPUJLvasQEV\r\nMzwzN31vfQ693cRQpw8WtlF4822/thNK029sh5MpIsd9Erbrnc801kaw4Fgn\r\nmnAfCfqyOT7hPNqpgw6ejIU9n5SsgQbkUx+tDBqPG19SiYy3Puo/9yhpgqm6\r\nE5OM0nOp9TxCbcvheQz3fLMEGnT+dL8dzFNu7KP2t/YtbYG3i0SM9n+rFxat\r\n73z4ZivRiZmQtsY4SOphTNaFKMbjr2u5Z2djdWDnUXQcl9PtFPr7AliO/Gk7\r\nQyYhopVu0MesCEuMPvdDfkH4F98ITHrvTRVQZpl2ZuZFy4LK591MQCle6Sov\r\ncAZmldbi0q68b4jdunCIeJYPfGXg2HqeQOVcf80nA2XC3WDmldqDlQjmgfAH\r\nqFXicM4Kx2WWsnvawj0vxu96mk8LXLCsJiM=\r\n=BiWu\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","unity":"2020.3","gitHead":"f4d0e2c6912ec6e479c0a65150b5d3debad0e427","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"changx","email":"changx.develop@gmail.com"},"_npmVersion":"8.1.0","description":"XmobiTea Unity package","directories":{},"displayName":"XmobiTea Json","_nodeVersion":"16.13.0","dependencies":{},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/com.xmobitea.changx.mini-json_1.3.9_1654657201919_0.8980147028696945","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"com.xmobitea.changx.mini-json","version":"1.4.0","keywords":["chang x","changx","xmobitea"],"author":{"url":"https://xmobitea.com","name":"Chang X","email":"changx.develop@gmail.com"},"license":"Apache-2.0","_id":"com.xmobitea.changx.mini-json@1.4.0","maintainers":[{"name":"changx","email":"changx.develop@gmail.com"}],"dist":{"shasum":"95590378bae568fdb5655b0966f00de5fabaa208","tarball":"https://registry.npmjs.org/com.xmobitea.changx.mini-json/-/com.xmobitea.changx.mini-json-1.4.0.tgz","fileCount":21,"integrity":"sha512-HpmdqWadkcK0a+fEXgFYbAMGhFiNlid+qnuH5S4ZVNRarui/UvNCFrqmmJCoJjSw+yPus0yhcTgcz5bEubVZLg==","signatures":[{"sig":"MEUCIQDPF4+8r78gASZ+Y33hQhNGU7jjGe5ylcbvmIwEcjwuiwIgQSR8gKKJUDBp7UzENRkIXaNPaPbaw1CjiBFgwnknzFA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57506},"unity":"2020.3","gitHead":"a1df5f68b52782919c752e83a9ec3f96d3102810","_npmUser":{"name":"changx","email":"changx.develop@gmail.com"},"_npmVersion":"10.8.2","description":"XmobiTea Unity Toolkit packages","directories":{},"displayName":"XmobiTea Json","_nodeVersion":"20.17.0","dependencies":{"com.xmobitea.changx.app":"1.4.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/com.xmobitea.changx.mini-json_1.4.0_1772119486313_0.8100937455207078","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"com.xmobitea.changx.mini-json","version":"1.5.0","keywords":["chang x","changx","xmobitea"],"author":{"url":"https://xmobitea.com","name":"Chang X","email":"changx.develop@gmail.com"},"license":"Apache-2.0","_id":"com.xmobitea.changx.mini-json@1.5.0","maintainers":[{"name":"changx","email":"changx.develop@gmail.com"}],"dist":{"shasum":"da0b1416b49e1536bc11d732de86d8210c3a42d8","tarball":"https://registry.npmjs.org/com.xmobitea.changx.mini-json/-/com.xmobitea.changx.mini-json-1.5.0.tgz","fileCount":25,"integrity":"sha512-r2HkljRzX8NMFNXRFT+JzWzKZnU+s6pad9Ch2s/csZJ+tbNlKeDaNrjRzRx5gkWNP1eDJhKWxwW1ddJ26XFA/w==","signatures":[{"sig":"MEQCICpNHERcMgDYedrb2i6uP2o/qJpjO4LwQ1UHERfIFpdNAiBb83a2c2CZ2iHtDfQi70O486Wn14EfyEBCyS/oxZoPdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72897},"unity":"2022.3","gitHead":"8a69be78344a9d715d5aae334a681f1bf75ce2ea","_npmUser":{"name":"changx","email":"changx.develop@gmail.com"},"_npmVersion":"10.8.2","description":"XmobiTea Unity Toolkit packages","directories":{},"displayName":"XmobiTea Json","_nodeVersion":"20.17.0","dependencies":{"com.xmobitea.changx.app":"1.5.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/com.xmobitea.changx.mini-json_1.5.0_1778689571970_0.8551480279043095","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"com.xmobitea.changx.mini-json","version":"1.5.1","keywords":["chang x","changx","xmobitea"],"author":{"url":"https://xmobitea.com","name":"Chang X","email":"changx.develop@gmail.com"},"license":"Apache-2.0","_id":"com.xmobitea.changx.mini-json@1.5.1","maintainers":[{"name":"changx","email":"changx.develop@gmail.com"}],"dist":{"shasum":"a5cf3d39f812f7fddd926d7a3ca9ac63fcdc4386","tarball":"https://registry.npmjs.org/com.xmobitea.changx.mini-json/-/com.xmobitea.changx.mini-json-1.5.1.tgz","fileCount":25,"integrity":"sha512-HAJ9SHb09Tw44Buor6Cp94IG4su8Sz46cREpdsI/M9BxAhmKP8T2453oU2V0eKQIOXMcd9e7NSb9Bf1OK+wWfQ==","signatures":[{"sig":"MEUCIQC4AnRkRESqEkdZlpS4TASF6geOkYMNGevKhZKxLLtmigIgdjOYfB71RTIljmFyqUq7NvXMoH8BYSYMNZFLOIbnK6Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74524},"unity":"2022.3","gitHead":"1b2c94d1025b98af0e93011d9ab7da6239fe627a","_npmUser":{"name":"changx","email":"changx.develop@gmail.com"},"_npmVersion":"10.8.2","description":"XmobiTea Unity Toolkit packages","directories":{},"displayName":"XmobiTea Json","_nodeVersion":"20.17.0","dependencies":{"com.xmobitea.changx.app":"1.5.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/com.xmobitea.changx.mini-json_1.5.1_1780225341312_0.5572998423093989","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"com.xmobitea.changx.mini-json","version":"1.5.2","displayName":"XmobiTea Json","description":"XmobiTea Unity Toolkit packages","unity":"2022.3","dependencies":{"com.xmobitea.changx.app":"1.5.2"},"keywords":["chang x","changx","xmobitea"],"author":{"name":"Chang X","email":"changx.develop@gmail.com","url":"https://xmobitea.com"},"license":"Apache-2.0","_id":"com.xmobitea.changx.mini-json@1.5.2","gitHead":"9d8761389a09fd51814c64a911448e7715c1dc76","_nodeVersion":"20.17.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-rBB5tcyCNG1r8Y2FjnrYxHdpc6wBKiL08FHHst/XD02CKO7YN6GR5akPKflrO07ETLg426OY2Qc0xDM21/1uag==","shasum":"7eba3e426940b4f10b4e50fd0c8381073ee14b0c","tarball":"https://registry.npmjs.org/com.xmobitea.changx.mini-json/-/com.xmobitea.changx.mini-json-1.5.2.tgz","fileCount":25,"unpackedSize":74888,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC9Md0mT3xPIS6ZkH12Q1bl4duIUdBXLM4GDEw3hFmLpQIhAMLTVIUxn7QSw7jStAY4ziMqvaWU+74CuKPV0/d0fJjQ"}]},"_npmUser":{"name":"changx","email":"changx.develop@gmail.com"},"directories":{},"maintainers":[{"name":"changx","email":"changx.develop@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/com.xmobitea.changx.mini-json_1.5.2_1780326562805_0.9768017413650849"},"_hasShrinkwrap":false}},"time":{"created":"2021-04-08T11:15:54.670Z","modified":"2026-06-01T15:09:23.049Z","1.0.0":"2021-04-08T11:15:54.866Z","1.0.2":"2021-04-08T11:51:32.156Z","1.1.0":"2021-04-23T11:22:41.311Z","1.2.0":"2021-08-07T12:29:27.020Z","1.2.1":"2021-08-07T12:33:30.055Z","1.3.0":"2022-06-04T12:46:12.188Z","1.3.1":"2022-06-04T14:13:35.218Z","1.3.6":"2022-06-04T15:46:22.922Z","1.3.8":"2022-06-06T09:34:03.481Z","1.3.9":"2022-06-08T03:00:02.922Z","1.4.0":"2026-02-26T15:24:46.543Z","1.5.0":"2026-05-13T16:26:12.137Z","1.5.1":"2026-05-31T11:02:21.456Z","1.5.2":"2026-06-01T15:09:22.946Z"},"author":{"name":"Chang X","email":"changx.develop@gmail.com","url":"https://xmobitea.com"},"license":"Apache-2.0","keywords":["chang x","changx","xmobitea"],"description":"XmobiTea Unity Toolkit packages","maintainers":[{"name":"changx","email":"changx.develop@gmail.com"}],"readme":"# XmobiTea Json\r\n\r\nLightweight JSON parser/serializer plus dictionary-backed typed data wrappers for Unity.\r\n\r\n## AI Quick Contract\r\n\r\nThis section is the shortest summary when you only need the core usage rules.\r\n\r\n- This package is not a generic POCO serializer like `JsonUtility` or `Newtonsoft.Json`.\r\n- Core parser/serializer is `CXJson`.\r\n- Main container types are:\r\n  - `CXData`\r\n  - `CXRequestData`\r\n  - `CXObject`\r\n- Parsed JSON objects become `Dictionary<string, object>`.\r\n- Parsed JSON arrays become `List<object>`.\r\n- Parsed numbers are read as `double` by the parser.\r\n- Typed getters in `CXData` convert from those stored values with explicit fallback rules.\r\n- `CXObject.FromJson(...)` only succeeds when the JSON root is an object, not when the root is an array.\r\n- Serialization recognizes `ICXData` and serializes its `BaseData`.\r\n\r\n## Need-Based Routing\r\n\r\nOpen these only when the current task needs them. There is no fixed read order.\r\n\r\n- `AGENTS.md`: package-level rules for code generation and maintenance.\r\n- `AI_USAGE.md`: short machine-friendly usage rules for using this package without reading the implementation.\r\n\r\n## What This Package Provides\r\n\r\n## `CXJson`\r\n\r\nLow-level JSON parser and serializer.\r\n\r\n## `CXData`\r\n\r\nDictionary-backed typed read container with convenience getters and list accessors.\r\n\r\n## `CXRequestData`\r\n\r\nMutable request-building container with `Add*` helper methods.\r\n\r\n## `CXObject`\r\n\r\nObject-root wrapper on top of `CXRequestData`, commonly used for parsed JSON objects.\r\n\r\n## `ICXData`\r\n\r\nInterface exposing `BaseData` so wrapper types can be serialized through `CXJson`.\r\n\r\n## Runtime Files\r\n\r\n- `Runtime/ICXData.cs`\r\n- `Runtime/CXData.cs`\r\n- `Runtime/CXJson.cs`\r\n- `Runtime/CXRequestData.cs`\r\n- `Runtime/CXObject.cs`\r\n\r\n## Exact Runtime Behavior\r\n\r\n## 1. `CXJson`\r\n\r\n### Parsing\r\n\r\n`CXJson.From(string json)` returns:\r\n\r\n- `Dictionary<string, object>` for object roots\r\n- `List<object>` for array roots\r\n- primitive values for primitive roots\r\n- `null` when parsing fails or input is `null`\r\n\r\nImportant parser behaviors:\r\n\r\n- numbers are parsed as `double`\r\n- booleans are parsed as `bool`\r\n- strings are parsed as `string`\r\n- arrays are parsed as `List<object>`\r\n- objects are parsed as `Dictionary<string, object>`\r\n- `null` becomes `null`\r\n\r\nThis means numeric getters in higher-level wrappers often need to convert from `double`.\r\n\r\n### Serialization\r\n\r\n`CXJson.To(object obj)` serializes:\r\n\r\n- `ICXData` by serializing `BaseData`\r\n- `IDictionary` as JSON object\r\n- `IList` as JSON array\r\n- strings/chars as JSON strings\r\n- numeric primitives with invariant culture\r\n- unsupported objects by calling `ToString()` and serializing that string\r\n\r\nImportant implication:\r\n\r\n- arbitrary custom classes are not reflected into JSON fields,\r\n- they become strings unless they implement `ICXData` or are already dictionaries/lists/primitives.\r\n\r\n## 2. `CXData`\r\n\r\n`CXData` is the main typed read wrapper.\r\n\r\nIts backing store is:\r\n\r\n```csharp\r\nIDictionary<string, object>\r\n```\r\n\r\n### Construction\r\n\r\nSupported constructors:\r\n\r\n- empty constructor\r\n- from another `CXData`\r\n- from `IDictionary<string, object>`\r\n\r\nWhen constructed from a dictionary:\r\n\r\n- nested `Dictionary<string, object>` values are converted into `CXObject`\r\n- other values are stored as-is\r\n\r\n### `JSON`\r\n\r\n`JSON` serializes the current backing dictionary through `CXJson.To(...)`.\r\n\r\n### Indexer\r\n\r\n`this[string key]`:\r\n\r\n- returns `null` if the key does not exist\r\n- overwrites existing keys on set\r\n\r\n### Scalar getters\r\n\r\nImportant getter rules:\r\n\r\n- `GetString(...)` returns `string.Empty` when the key is missing or not a string\r\n- numeric getters return nullable types\r\n- many numeric getters accept both the target numeric type and parsed `double`\r\n- `GetBoolean(...)` returns `bool?`\r\n- `GetDate(...)` expects exact UTC string format:\r\n\r\n```text\r\nyyyy-MM-dd'T'HH:mm'Z'\r\n```\r\n\r\nIf the stored string does not match that exact format, parsing will fail.\r\n\r\n### List getters\r\n\r\nList getters work only when the stored value is compatible with the expected internal representation.\r\n\r\nTypical cases:\r\n\r\n- parsed JSON arrays are usually `List<object>`\r\n- list getters then iterate and convert compatible values\r\n\r\nImportant behavior:\r\n\r\n- unsupported element types are silently skipped\r\n- unsupported list shapes return `null`\r\n\r\n### Object getters\r\n\r\n- `GetObject(...)` returns `CXData`\r\n- `GetCXData(...)` returns `CXRequestData`\r\n- `GetCXDataList(...)` returns `List<CXRequestData>`\r\n\r\nThese methods wrap nested dictionaries into the corresponding wrapper types.\r\n\r\n## 3. `CXRequestData`\r\n\r\n`CXRequestData` inherits from `CXData` and adds mutable builder-style methods.\r\n\r\nImportant methods:\r\n\r\n- `Add(...)`\r\n- `Remove(...)`\r\n- `AddString(...)`\r\n- `AddJSONStringAsObject(...)`\r\n- `AddDate(...)`\r\n- `AddNumber(...)`\r\n- `AddNumberList(...)`\r\n- `AddObject(...)`\r\n- `AddObjectList(...)`\r\n- `AddStringList(...)`\r\n- `AddBoolean(...)`\r\n\r\n### Date behavior\r\n\r\n`AddDate(...)` serializes the date as UTC string using:\r\n\r\n```text\r\nyyyy-MM-dd'T'HH:mm'Z'\r\n```\r\n\r\nThis matches the format expected by `GetDate(...)`.\r\n\r\n### Object behavior\r\n\r\n`AddObject(...)` stores `child.BaseData`, not the wrapper instance itself.\r\n\r\n`AddObjectList(...)` stores the provided `List<CXData>` directly. Serialization still works because `CXJson` handles `ICXData` elements inside lists.\r\n\r\n## 4. `CXObject`\r\n\r\n`CXObject` is a specialized wrapper for object-root JSON.\r\n\r\nImportant behavior:\r\n\r\n- `CXObject.FromJson(...)` returns `null` if the root JSON is not an object\r\n- constructor `CXObject(string type)` stores `@class = type`\r\n\r\nUse `CXObject` when your JSON root must be an object rather than an array.\r\n\r\n## Basic Usage\r\n\r\n## Build request-style data\r\n\r\n```csharp\r\nusing XmobiTea.MiniJson;\r\n\r\nvar request = new CXRequestData()\r\n\t.AddString(\"name\", \"Player\")\r\n\t.AddNumber(\"score\", 10)\r\n\t.AddBoolean(\"vip\", true);\r\n\r\nUnityEngine.Debug.Log(request.JSON);\r\n```\r\n\r\n## Parse object-root JSON\r\n\r\n```csharp\r\nusing XmobiTea.MiniJson;\r\n\r\nvar json = \"{\\\"name\\\":\\\"Player\\\",\\\"score\\\":10}\";\r\nvar data = CXObject.FromJson(json);\r\n\r\nvar name = data.GetString(\"name\");\r\nvar score = data.GetInt(\"score\");\r\n```\r\n\r\n## Nested object access\r\n\r\n```csharp\r\nusing XmobiTea.MiniJson;\r\n\r\nvar parent = new CXRequestData();\r\nparent.AddObject(\"child\", new CXRequestData().AddString(\"id\", \"abc\"));\r\n\r\nvar child = parent.GetCXData(\"child\");\r\nvar id = child.GetString(\"id\");\r\n```\r\n\r\n## Do / Don't\r\n\r\n### Do\r\n\r\n- Do treat parsed numeric JSON values as `double` internally unless a wrapper converted them.\r\n- Do use `CXObject.FromJson(...)` only when the root is known to be a JSON object.\r\n- Do use `CXRequestData` for request-building and mutation.\r\n- Do use `CXData` / `CXObject` for typed reads.\r\n- Do treat unsupported custom objects as non-serializable unless converted first.\r\n\r\n### Don't\r\n\r\n- Don't assume this package reflects arbitrary C# classes into JSON fields.\r\n- Don't assume all getters throw on mismatch. Most return nullable/default fallback values.\r\n- Don't assume array roots can be parsed by `CXObject.FromJson(...)`.\r\n- Don't assume `GetString(...)` returns `null` for missing keys. It returns `string.Empty`.\r\n- Don't assume all numeric precision is preserved when data passes through `double`.\r\n\r\n## Common Mistakes\r\n\r\n### Mistake 1: Using `CXObject.FromJson(...)` for array roots\r\n\r\nWrong:\r\n\r\n```csharp\r\nvar data = CXObject.FromJson(\"[1,2,3]\");\r\n```\r\n\r\nThis returns `null` because the root is not a dictionary/object.\r\n\r\n### Mistake 2: Expecting numbers to stay strongly typed after parse\r\n\r\nParsed JSON numbers become `double` first.\r\n\r\nSo getters like `GetInt(...)`, `GetLong(...)`, `GetFloat(...)`, and `GetDecimal(...)` often convert from `double`.\r\n\r\n### Mistake 3: Expecting arbitrary object serialization\r\n\r\nWrong assumption:\r\n\r\n- `CXJson.To(myCustomClass)` serializes all fields of `myCustomClass`.\r\n\r\nThat is false.\r\n\r\nCurrent behavior:\r\n\r\n- unknown object types are serialized using `ToString()`.\r\n\r\n### Mistake 4: Assuming missing strings return `null`\r\n\r\n`GetString(...)` returns `string.Empty`, not `null`.\r\n\r\n## Repository Usage Pattern\n\nInside this repository, direct usage is currently lightweight. `Assets/TestBehaviour.cs` demonstrates building a `CXRequestData`, serializing it through `JSON`, and reading typed values after constructing a wrapper from JSON.\n\nUse the package with this pattern:\n\r\n- parse dynamic JSON into wrappers,\r\n- read with typed helper methods,\r\n- build request-like payloads with `CXRequestData`.\r\n\r\n## Decision Table\r\n\r\nUse this package when:\r\n\r\n- you need lightweight dynamic JSON parsing without an external dependency,\r\n- you want dictionary-backed typed accessors,\r\n- you want simple request-style JSON construction.\r\n\r\nDo not use this package when:\r\n\r\n- you need full POCO serialization/deserialization,\r\n- you need attribute-driven mapping,\r\n- you need exact numeric semantics across arbitrary large values,\r\n- you need advanced schema validation.\r\n\r\n## Expected AI Usage Pattern\r\n\r\nWhen an AI agent generates code using this package, the correct default pattern is:\r\n\r\n1. Use `CXObject.FromJson(...)` for object-root JSON.\r\n2. Use `CXRequestData` for building payloads.\r\n3. Treat numeric parse results as conversion-based, not strongly typed from the source.\r\n4. Treat returned wrapper values as nullable/default-based rather than exception-based.\r\n\r\nAn AI agent should not:\r\n\r\n- claim this package is equivalent to `JsonUtility` or `Newtonsoft.Json`,\r\n- serialize arbitrary complex classes without manually converting them,\r\n- assume array-root JSON can be consumed by `CXObject.FromJson(...)`.\r\n\r\n## Namespace\r\n\r\n```csharp\r\nusing XmobiTea.MiniJson;\r\n```\r\n\r\n## Assembly Definition\r\n\r\nRuntime assembly:\r\n\r\n```text\r\ncom.xmobitea.changx.mini-json.runtime\r\n```\r\n\r\n## Package Metadata\r\n\r\n- Package name: `com.xmobitea.changx.mini-json`\r\n- Unity version: `2022.3+`\r\n- License: `Apache-2.0`\r\n","readmeFilename":"README.md"}