
本文详解如何用 PHP 构建嵌套键值结构的 JSON(如 {"lots":[...]}),避免误用索引数组导致输出为 JSON 数组而非 JSON 对象,从而解决 C# Unity 等外部系统因 ArgumentException: JSON must represent an object type 报错的问题。
本文详解如何用 php 构建嵌套键值结构的 json(如 {"lots":[...]}),避免误用索引数组导致输出为 json 数组而非 json 对象,从而解决 c# unity 等外部系统因 `argumentexception: json must represent an object type` 报错的问题。
要让 PHP 输出符合预期的 JSON 对象(即根节点为 {} 而非 []),关键在于正确初始化关联数组(associative array),而非索引数组(indexed array)。原始代码中:
$lots = array("lots"); // ❌ 错误:创建索引数组,元素 0 的值为字符串 "lots"
$lots[] = array("Id" => 32932, ...); // 追加到索引数组 → 最终是 [ "lots", {...}, {...} ]这导致 json_encode() 输出一个 JSON 数组([]),而 C# Unity 的反序列化器明确要求输入是 JSON 对象({}),因此抛出 ArgumentException: JSON must represent an object type。
✅ 正确做法是:将 "lots" 作为键名(key),其对应值为一个空数组,再向该子数组中追加数据项:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
$lots = array(); // 初始化空关联数组(等价于 $lots = [];)
// 创建键 "lots",值为一个空数组,并向其中追加两个对象
$lots["lots"][] = array("Id" => 32932, "Type" => "G", "x" => 1, "y" => 2, "z" => 3);
$lots["lots"][] = array("Id" => 32933, "Type" => "R", "x" => 4, "y" => 5, "z" => 6);
$json = json_encode($lots);
echo $json;
// 输出:{"lots":[{"Id":32932,"Type":"G","x":1,"y":2,"z":3},{"Id":32933,"Type":"R","x":4,"y":5,"z":6}]}? 小贴士:
立即学习“PHP免费学习笔记(深入)”;
-
json_encode()默认将 PHP 关联数组(含字符串键)转为 JSON 对象{},将纯数字索引数组转为 JSON 数组[]; - 若需确保输出格式严格(如避免 Unicode 转义、美化输出或强制 UTF-8),可添加选项:
json_encode($lots, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - 建议在生产环境中添加错误检查:
if (json_last_error() !== JSON_ERROR_NONE) { throw new RuntimeException('JSON encoding failed: ' . json_last_error_msg()); }
通过这一结构修正,PHP 输出即可被 C# Unity 的 JsonUtility.FromJson<t>()</t> 或 System.Text.Json.JsonSerializer.Deserialize<t>()</t> 正确解析,彻底规避类型不匹配异常。


















