
本文详解如何用 PHP 构建嵌套键值对形式的 JSON 对象(而非数组),解决因数据结构不匹配导致的 ArgumentException: JSON must represent an object type 错误。
本文详解如何用 php 构建嵌套键值对形式的 json 对象(而非数组),解决因数据结构不匹配导致的 `argumentexception: json must represent an object type` 错误。
在开发前后端或跨语言(如 PHP 与 C# Unity)交互时,JSON 数据结构的语义一致性至关重要。你遇到的问题本质是:PHP 中混淆了关联数组(object-like)与索引数组(array-like)的声明方式,导致 json_encode() 输出了 JSON 数组([...])而非预期的 JSON 对象({...})。
原始代码:
$lots = array("lots"); // ← 这里创建的是索引数组:[0 => "lots"]
$lots[] = array("Id" => 32932, "Type" => "G", "x" => 1, "y" => 2, "z" => 3);
// ...
执行后 $lots 实际是一个包含三个元素的索引数组:["lots", {...}, {...}],json_encode() 将其序列化为 JSON 数组——这与 C# 的 JsonConvert.DeserializeObject<t></t>(要求根节点为对象)冲突,故抛出 ArgumentException。
✅ 正确做法是构建关联数组(即 PHP 中的“字典”或“对象模拟”),显式指定顶层键 "lots",并将其值设为一个子数组:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
$lots = array(); // 初始化空关联数组(非索引数组)
// 使用字符串键 "lots",并为其赋值一个数组(存放 lot 项)
$lots["lots"] = array(); // 可选:显式初始化
$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}]}
? 关键区别总结:
-
$arr = ["lots"]→ 索引数组(键为0, 值为字符串"lots")→json_encode→[...](JSON array) -
$arr["lots"] = [...]→ 关联数组(键为"lots",值为数组)→json_encode→{...}(JSON object)
⚠️ 注意事项:
- 始终使用
json_last_error()检查编码是否成功,避免静默失败:$json = json_encode($lots); if ($json === false) { throw new RuntimeException('JSON encode failed: ' . json_last_error_msg()); } - 若需保证输出格式更规范(如缩进、UTF-8 不转义中文),可添加选项:
$json = json_encode($lots, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
- 在 Unity C# 端,应定义匹配的类结构,例如:
public class Response { public List<lot> lots; } public class Lot { public int Id; public string Type; public int x, y, z; }</lot>
通过明确区分 PHP 数组的键类型(数字索引 vs 字符串键),即可精准控制 JSON 输出结构,确保跨平台数据契约的一致性。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










