【发布时间】:2019-06-27 21:24:27
【问题描述】:
我正在对端点进行 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 的 DevTools 网络部分的响应选项卡中的 sn-ps。
由于某种原因,对象数组没有被解析为 javascript,而是剩余的字符串。我在 PHP 中将 Content Type 设置为 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);
【问题讨论】:
-
因为你是
json_encode-ing 整个对象 - 它会将那些不能立即识别为数字的东西视为字符串。 -
@JackBashford 这似乎不是旧 API 的问题。它有一个带有任务数组属性的项目对象,并且仍在正确解析它们。有什么可以正确强制我丢失的吗?
-
您似乎在
value列中存储了一个 JSON 字符串。当您从数据库中提取它时,它只是一个简单的字符串,这就是它在json_encode()中的处理方式 -
另外,您一直在引用“旧 API”。实际看到可能会有所帮助,因此我们可以发现差异。
-
使用 SQL Server 2008 可能会丢失一个功能?
标签: javascript php json rest