JSON.parse 应该是递归的吗?

Posted

技术标签:

【中文标题】JSON.parse 应该是递归的吗?【英文标题】:Is JSON.parse supposed to be recursive? 【发布时间】:2011-05-04 16:43:16 【问题描述】:

我正在解析一个像这样的 json 字符串:

ring = JSON.parse(response);

现在,ring 是一个对象,但 ring.stones 只是一个字符串,而它也应该是一个对象。

如果我打电话:

ring.stones = JSON.parse(ring.stones);

它现在是正确的对象。

我不知道这是否是正确的行为,或者我是否在某处遇到问题阻止它进行递归解析?如果它应该递归解析,是否有任何已知问题会阻止它?


更新

这是解析前的完整响应:

"ring_id":"9","stone_count":"4","style_number":"style 4","syn10":"436.15","gen10":"489.39","syn14":" 627.60","gen14":"680.85","available":"yes","type":"ring","engravings_count":"0","engravings_char_count":"0","engravings_band":"10" ,"石头":"[\"stone_id\":\"27\",\"ring_id\":\"9\",\"stone_shape\":\"round\",\"stone_x\": \"132.80\",\"stone_y\":\"114.50\",\"stone_width\":\"71.60\",\"stone_height\":\"71.60\",\"stone_rotation\":\" 0.00\",\"stone_number\":\"1\",\"stone_mm_width\":\"5.00\",\"stone_mm_height\":\"5.00\",\"stone_id\":\" 28\",\"ring_id\":\"9\",\"stone_shape\":\"round\",\"stone_x\":\"100.50\",\"stone_y\":\"166.20\ ",\"stone_width\":\"36.20\",\"stone_height\":\"36.60\",\"stone_rotation\":\"0.00\",\"stone_number\":\"2\", \"stone_mm_width\":\"2.50\",\"stone_mm_height\":\"2.50\",\"stone_id\":\"29\",\"ring_id\":\"9\", \"stone_shape\":\"round\",\"stone_x\":\"200.20\",\"stone_y\":\"105.10\",\"stone_width\":\"33.90\",\" stone_height\":\"33.90\",\"stone_rotation\":\"0.00\",\"stone_number\" :\"3\",\"stone_mm_width\":\"2.50\",\"stone_mm_height\":\"2.50\",\"stone_id\":\"30\",\"ring_id\" :\"9\",\"stone_shape\":\"round\",\"stone_x\":\"165.80\",\"stone_y\":\"82.50\",\"stone_width\":\ "35.50\",\"stone_height\":\"33.90\",\"stone_rotation\":\"0.00\",\"stone_number\":\"4\",\"stone_mm_width\":\"2.50 \",\"stone_mm_height\":\"2.50\"]","images":"[\"title\":\"white gold\",\"source\":\"Style4_4_W_M.png\ ",\"title\":\"黄金\",\"source\":\"Style4_4_Y_M.png\"]"


更新 2

根据 mikerobi 的回答,我能够弄清楚发生了什么:

这是我对其进行编码的地方:

$row = $sth->fetch(PDO::FETCH_ASSOC);

$row['stones'] = getStones($ring_id);
$row['images'] = getRingVariations($ring_id);

return json_encode($row);

但是函数 getStonesgetRingVariations 正在返回 json_encode'd 字符串。我需要更改它们以返回纯字符串。

【问题讨论】:

response 长什么样子? @KennyTM @dlamblin 我更新了答案以显示响应。 【参考方案1】:

你的 JSON 结构是错误的,它是用引号包裹石头,把它变成一个字符串。

您的 JSON 如下所示:


    stones: "[\"stone_id":\"27\",\"stone_id\":\"27\"]"

应该是这样的:


    stones: ["stone_id": 27,"stone_id": 27]

编辑

您似乎正在将所有值转换为字符串,包括数字,我更新了我的示例以反映这一点。

另外,我猜测您正在编写自己的代码来序列化 JSON,我强烈建议您使用现有的库。

【讨论】:

谢谢,我使用的是 php 内置的 JSON 编码器,但在重构之后,我错误地解析了两次。查看我的更新。【参考方案2】:

它是递归的,但您的输入字符串 (response) 格式不正确。去掉那些转义字符 (\") 再试一次。

【讨论】:

还有整个石头的引号。

以上是关于JSON.parse 应该是递归的吗?的主要内容,如果未能解决你的问题,请参考以下文章

深拷贝(递归)

JavaScript怎么使用递归将后台json数据转换成树结构

Windows 的 AcquireSRWLockExclusive 是递归的吗?

JSON.parse() 的实现

stdlib 的 qsort 是递归的吗?

用原生JS实现深拷贝