javascript - 嵌套在 JSON 响应中的值未被解析

标签 javascript php json rest

我正在对端点进行 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/

相关文章:

php - 如何在没有 json_encode() 的情况下将数组编码为 JSON?

javascript - 如何有效地将属性从一个对象复制到另一个对象?

javascript - AngularJS $http.get 结果到数组

c# - 如何获取客户端确认框的值来进行服务器端操作?

php - Wordpress - 试图删除顽固的标题

javascript - 增加 ReCaptcha 过期时间?

php - 无法在 PHP 中将字符串转换为 float - Laravel 5.2

PHP json_decode() 用看似有效的 JSON 返回 NULL?

javascript - 将一个 header 元素的值设置为另一个

javascript - 无法从多个 html 输入字段中添加或删除图像