Я делаю вызов 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"
},
Это фрагменты с вкладки Response в разделе сети Chrome DevTools.
По какой-то причине массивы объектов не анализируются в javascript и вместо этого остаются оставшимися строками. Я установил тип контента в json в PHP и использовал тип данных json в запросе. Чего мне не хватает?
Frontend
$.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);
Edit:
Подробности о старом 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);