我正在对端点进行 REST 调用,但遇到了一个问题,即内部属性保留字符串而不转换为 Javascript。
这是我得到的:
"43750": {
"taskId": 43750,
"statusId": 1,
"set_at": "2019-03-27 16:20:51",
"userId": 2,
"value": "[{\"text\":\"Recreational Vehicle\"}]" <-- Problem
},
这是我应该得到的(旧的 API 响应):
"43750": {
"userId": "2",
"timestamp": "2019-03-27 16:20:51",
"value": [
{
"text": "Recreational Vehicle"
}
],
"statusId": "1"
},
这些是 Chrome 开发工具网络部分中“响应”选项卡的片段。
由于某种原因,对象数组没有被解析为 javascript,而是剩余的字符串。我已在 PHP 中将内容类型设置为 json 并在请求中使用 json 数据类型。我错过了什么?
前端
$.ajax({
type: 'POST',
dataType: 'json',
url: API_URL,
data: {
action: 'getProject',
projectId: this.getActiveProjectId()
},
success: function (response) {
console.log('[AJAX RESPONSE] LOAD ACTIVE PROJECT', response);
debugger;
}
});
后端
<?php
$default_options = [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
];
$pdo = new PDO(
sprintf(
"dblib:host=%s;dbname=%s",
$server,
$database
),
$user,
$pass,
$default_options
);
/* Determine action, handle request */
/* Do PDO Query */
$tasks = $statement->fetchAll();
header("Access-Control-Allow-Origin: *");
header('Content-Type: application/json');
echo json_encode($tasks, JSON_PRETTY_PRINT);
编辑:
有关旧 API 的详细信息:
前端是一样的。后端由 MariaDB、PHP 和 mysqli_* 命令组成。我现在正在将其转换为使用 SQL Server 2008 和 PDO。
最后一个 API 只是这样做了:
$SQL = 'SELECT * FROM Project WHERE projectId='.$projectId;
$project = mysqli_fetch_assoc(mysqli_query($db, $SQL));
while ($taskRow = mysqli_fetch_assoc($result)) {
$project['tasks'][$taskRow['taskId']] = [
'userId' => $taskRow['userId'],
'timestamp' => $taskRow['timestamp'],
'value' => json_decode($taskRow['dataValue']),
'statusId' => $taskRow['statusId']
];
}
$SQL = 'SELECT * FROM Task WHERE projectId='.$projectId.' ORDER BY timestamp ASC';
$result = mysqli_query($db, $SQL);
while ($commentRow = mysqli_fetch_assoc($result)) {
$project['tasks'][$commentRow['taskId']]['comments'][] = [
'text' => $commentRow['commentText'],
'timestamp' => $commentRow['timestamp'],
'userId' => $commentRow['userId']
];
}
header("Access-Control-Allow-Origin: *");
json_encode([
'success' => true,
'project' => $project
], JSON_PRETTY_PRINT);
最佳答案
表中的 value
列包含一个 JSON
字符串。您需要在发送响应之前对其进行解码:
foreach ($tasks as &$task) {
$task['value'] = json_decode($task['value']);
}
或者在 JavaScript 中执行:
success: function(response) {
response.forEach(r => r.value = JSON.parse(r.value));
// rest of success function
}
关于javascript - 嵌套在 JSON 响应中的值未被解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56798636/