javascript - 在 json 数据中保存 CR/LF

标签 javascript php jquery mysql json

我正在将表格数据保存到一个 json 对象中。表格数据来自表格单元格中的 txt 输入和文本区域。

我在保存文本区域数据的 JSON 元素中遇到了 CR/LF 字符的问题。 JSON 数据很好地保存到数据库中,但是当我将它传回使用该数据填充表的 jQuery 函数时,我得到了这个:

SyntaxError: JSON.parse: bad control character in string literal at line 1 column 67 of the JSON data
var array = JSON.parse(notes),

在控制台中。

我将 JSON 数据放在 Notepad++ 中并打开显示所有字符,CR/LF 位于第 67 列。

这是我正在处理的 JSON 数据示例:

[["","","",""],["","9/23/14","",""],["","30789 detail, x_vendor_no**CR/LF HERE**
20597 header","",""],["","99 del invalid x_vendor_no","",""],["","30780","",""],["","","",""],["","","",""],["","","",""]]

有没有办法在数据中允许 CR/LF?

更新 11684 使用 replace 删除 CRLF 的\r 部分的建议将不起作用。原因如下:

这是使用 JSON 数据的完整函数: (已更新以使用下面的更新 #2 代码)

function PopulateTaskTableWithNotes(tableID,notesArray) {
    // JSON parse removed per answer suggestion
    var r, c, note;

    for (r = 0; r < notesArray.length; ++r) {
        for (c = 0; c < notesArray[r].length; ++c) {
            note = notesArray[r][c];
        $('#' + tableID + ' tr:nth-child(' + (r + 1) + ') td:nth-child(' + (c + 1) + ')').children(':first-child').val(note);
        }
    }
}

我在尝试解析 JSON 数据的行中仍然遇到错误。替换函数显然无法在数组元素中“找到”字符。

更新#2 这是我创建数组的方式:

var siteID = $('#ddlUserSites option:selected').val(),
    numRows = $('#' + tableID + ' tr').length,
    numCols = $('#' + tableID).find('tr:first th').length,
    notesArray = new Array(numRows),
    rowNum = 1,
    note = '',
    colNum;

while (rowNum <= numRows) {
    notesArray[rowNum] = new Array(numCols);

    // Reset colNum for next row iteration
    colNum = 1;
    while (colNum <= numCols) {
        note = '';

        if ($('#' + tableID + ' tr:nth-child(' + rowNum + ') td:nth-child(' + colNum + ')').children(':first-child').is('input,textarea')) {
            note = $('#' + tableID + ' tr:nth-child(' + rowNum + ') td:nth-child(' + colNum + ')').children(':first-child').val();
        }
        notesArray[rowNum][colNum] = note;
        //console.log('Note for rowNum ' + rowNum + ', colNum ' + colNum + ': ' + note);
        colNum++;
    }
    // Remove first element in current row array
    notesArray[rowNum].shift();
    rowNum++;
}
// Remove first element in array
notesArray.shift();
JSON.stringify(notesArray); // Added per an answer here
console.log('Final notesArray: ' + $.toJSON(notesArray));

$.ajax({
    data: {saveTaskNotes: 'true', userID:userID, siteID:siteID, taskTable:tableID, notes:notesArray},
    success: function(data) {
        console.log('Save task notes data: ' + data);
    }
});

“Final notesArray”控制台输出看起来不错,但是现在,添加了 stringify,上面的函数 (PopulateTaskTableWithNotes) 控制台输出显示它正在将数组中的每个字符作为一个单独的元素读取!

就创建函数和读取函数之间的数据发生了什么而言,这可能也会有所帮助:数组被保存到单个 MySQL 数据库字段,然后通过 $.ajax() 为 PopulateTable 函数检索(在两端)。

话虽如此,我是否需要查看我正在对 PHP 代码中的数组执行的操作?

更新 #3 这是获取数据并将数据写入 MySQL 数据库的 PHP 函数:

function SaveTaskNotes($userID,$siteID,$taskTable,$notes) {
    $notes = json_encode($notes);
    $insertUpdateTaskNotesResult = '';
    $insertTaskNotes = "INSERT INTO userProgress (userProgressUserID,userProgressSiteID,userProgressNotesTable,userProgressNotes) values ($userID,$siteID,'" . $taskTable . "','" . $notes . "')";
    $log->lwrite('$insertTaskNotes: ' . $insertTaskNotes);
    $resultInsertTaskNotes = @mysqli_query($dbc,$insertTaskNotes);
    if ($resultInsertTaskNotes) {
        $insertUpdateTaskNotesResult = 'insertTaskNotesSuccess';
    } else {
        if (mysqli_error($dbc) != '') {
            $log->lwrite('INSERT TASK NOTES: An error occurred while attempting to add the task notes. Query: ' . $insertTaskNotes . ', mysqli_error: ' . mysqli_error($dbc));
        }
        $insertUpdateTaskNotesResult = 'insertTaskNotesFail';
    }
    echo $insertUpdateTaskNotesResult;
}

下面是从数据库中获取数据并将其发送到上面的 $.ajax 函数的函数:

function GetUserTaskNotes($userID,$siteID,$taskTableID) {
    $queryGetUserTaskNotes = "SELECT userProgressNotes FROM userProgress WHERE userProgressUserID = $userID AND userProgressSiteID = $siteID AND userProgressNotesTable = '" . $taskTableID . "'";
    $log->lwrite('$queryGetUserTaskNotes: ' . $queryGetUserTaskNotes);
    $resultGetUserTaskNotes = @mysqli_query($dbc,$queryGetUserTaskNotes);
    if ($resultGetUserTaskNotes) {
        $taskNotes = mysqli_fetch_assoc($resultGetUserTaskNotes);
        $log->lwrite('Retrieved $taskNotes[\'userProgressNotes\']: ' . $taskNotes['userProgressNotes']);
        echo $taskNotes['userProgressNotes'];
    } else {
        if (mysqli_error($dbc) != '') {
            $log->lwrite('GET TASK NOTES: An error occurred while attempting to retrieve the task notes. Query: ' . $queryGetUserTaskNotes . ', mysqli_error: ' . mysqli_error($dbc));
        }
        echo 'getTaskNotesFail';
    }
}

在保存和获取函数中,$log 输出显示数组永远不会改变(使用上面的 js/php 代码)并将数组粘贴到 Notepad++ 中显示 CR/LF 仍然存在。

最佳答案

不要使用 JSON.parse,数据已经是 JSON 并且 Javascript 可以使用它。

只有在传递字符串时才需要它,想象一下 JSON.parse() 就像 string2json() 一样。

我认为这可能已经是您问题的解决方案,我从来没有遇到过换行符的问题。

正如 Luis 所说,除了 JSON.parse 之外,问题不在于您的客户端(Javascript、jQuery),而是提供站点错误。

PHP 示例:

<?php
echo json_encode(array("test" => "


x"));

PHP 正确转义字符:

{"test":"\r\n\r\n\r\nx"}

但是您的数据源提供了格式错误的 JSON。

要解决 JSON 问题,请使用准备好的语句或使用:

$notes = str_replace('\', '\\', json_encode($notes)); // in SaveTaskNotes

关于javascript - 在 json 数据中保存 CR/LF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26018660/

相关文章:

javascript - 尝试让 stylize() 使用 CSS 样式分别随机选择单元格 bgcolor 和文本样式

php - SELECT WHERE Date 等于用户输入的内容不工作

php - 用于简单sql注入(inject)的Base64编码字符串

php - ajax mysql 搜索不显示正确的结果

javascript - 打印一个数组?

javascript - Firefox 中未对齐的 Bootstrap Carousel 图像

javascript - 如何避免 Javascript/jQuery 中的硬编码、链式异步函数?

Javascript异步加载和执行顺序

php - 在 PHP 中使用 AJAX 请求保存 base64 编码的图像

javascript - 在 css 类中禁用控件的不同方法