Значения во вложенном ответе JSON не анализируются - PullRequest
0 голосов
/ 28 июня 2019

Я делаю вызов 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);

1 Ответ

2 голосов
/ 28 июня 2019

Столбец 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...