2014-09-24 107 views
4

我将表数据保存到json对象。表格数据来自表格单元格中的txt输入和textareas。在json数据中保存CR/LF

我遇到一个问题与持有textarea数据的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), 

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

我把记事本的JSON数据++与显示的所有字符上与CR/LF在列67

下面是我的工作JSON数据的样本有没有办法在数据中允许CR/LF?

UPDATE 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); 
    } 
}); 

的“最终notesArray”控制台输出看起来不错,但现在,随着字符串化增加,上方的功能(PopulateTaskTableWithNotes)控制台输出显示它正在读取数组中的每个字符作为单独的元素!

也许这也会有帮助,至于创建和读取函数之间发生了什么:数组将被保存到单个MySQL数据库字段,然后通过$ .ajax()检索PopulateTable函数(两端)。

话虽如此,我需要看看我正在做什么/在PHP代码中的数组?

更新#3 这里的PHP函数,它的数据和写入到MySQL数据库:

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; 
} 

下面是从数据库获取数据的功能,并将其发送到上述$就功能:

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'; 
    } 
} 

在这两个保存和获取功能$日志输出显示阵列从不改变(与上述的js/PHP的码)和在粘贴阵列记事本++表明CR /如果始终在那里。

+0

快速修复:'notes.replace( “\ r \ n”, “”);'。尽管如此,我不会推荐。 – 11684 2014-09-24 13:54:18

+0

或者可能只是'notes.replace(“\ r”,“”);'。 – 11684 2014-09-24 13:54:53

+0

@ 11684:我希望找到一个解决方案,让我保留这些新行,或以某种方式重新填充用户输入新行的textarea。 – marky 2014-09-24 13:57:16

回答

2

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

你只需要它时,通过一个字符串,想象JSON.parse()喜欢string2json() beeing。

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

正如路易斯所说,问题不在于你的客户端(Javascript,jQuery),除了JSON.parse,但提供的网站是错误的。

示例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 
+1

你说过:“不要使用JSON.parse,数据已经是JSON,Javascript可以使用它。”虽然这是有道理的,并且控制台显示,当它从PHP脚本来到函数时,我会看到它,如果我不使用parse,则数组被解释为每个字符都是它自己的数组元素。此外,使用JSON.parse(notesArray)时,它没有新的行字符工作很好!那么解决方案是什么? – marky 2014-09-24 18:45:58

+0

请在添加ajax调用(发布json)和PHP代码之前添加PHP代码,然后尝试ajax JSON。数据库交互之前或之后有短暂的错误。 – DanFromGermany 2014-09-24 18:50:39

+0

请参阅“Update#3”中的php代码,谢谢! – marky 2014-09-24 19:02:44

0

那么,错误是在输入数据(显示问题)。JSON字符串中的文字中不能有CR或LF。你可以有的是,字符逃逸为\r\n。问题出在另一端,转义代码被实际的字符替换,因此完整的JSON字符串变得无效。

+0

使当数组中的元素被添加时,我将如何转义CR和LF? – marky 2014-09-24 14:48:47

+0

将'JSON.stringify(values)'应用于整个数据,而不是通过元素上的部分,您将得到一个唯一的字符串,所有。你会得到cr&如果正确编码也。有很多例子。 [-1-](http://stackoverflow.com/questions/6810084/encoding-javascript-object-to-json-string)[-2-](http://stackoverflow.com/questions/10919965/how- do-i-encode-a-javascript-object-as-json) – 2014-09-24 15:02:21

+0

当数组创建完毕后,我在表格数据迭代完成后对数组使用了JSON.stringify。控制台输出看起来很好(几乎完全像添加字符串之前一样)。并根据您的建议,我从它读取数组的位置删除了json.parse。那时我没有得到一个错误,但每次它通过数组元素迭代时的控制台输出都显示它将每个单独的字符作为数组元素分隔开来!我已经将我的数组构建脚本添加到了我的问题中。 – marky 2014-09-24 15:44:56