2016-09-16 4 views
0

У меня проблема с кодировкой и расшифровкой json-данных. В JS Я посылаю запрос с типом данных «JSON», это выглядит следующим образом:Как json_decode строка со специальными символами ("\")

{\"front\":{\"0\":{\"type\":\"text\",\"width\":\"55px\",\"height\":\"27px\",\"top\":\"151px\",\"left\":\"86px\",\"zIndex\":\"1\",\"svg\":\"<svg width=\\\"54.9375\\\" height=\\\"27.09375\\\" viewBox=\\\"0 0 54.9375 27.09375\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\"><g id=\\\"0.7882792934370437\\\"><text fill=\\\"#FF0000\\\" stroke=\\\"none\\\" stroke-width=\\\"0\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"\\\" y=\\\"\\\" text-anchor=\\\"start\\\" font-size=\\\"24px\\\" font-family=\\\"arial\\\" data-textcurve=\\\"1\\\" data-itemzoom=\\\"1 1\\\" data-textspacing=\\\"0\\\"><textPath xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" xlink:href=\\\"http://138.68.62.219/Buy-Hanes-T-shirt-PC61LS#textPath-item-0\\\"><tspan dy=\\\"0\\\">Hello</tspan></textPath></text></g><defs><path id=\\\"textPath-item-0\\\" d=\\\"M 0.125 22.117808976867764 A 3093.9720937064453 3093.9720937064453 0 0 1 54.124314613414626 22.117808976867764\\\"></path></defs></svg>\",\"rotate\":0,\"text\":\"Hello\",\"color\":\"#FF0000\",\"fontFamily\":\"arial\",\"align\":\"center\",\"outlineC\":\"none\",\"outlineW\":0}} 

Затем я сохранить его в ячейке MySQL, это выглядит следующим образом:

{\\&quot;front\\&quot;:{\\&quot;0\\&quot;:{\\&quot;type\\&quot;:\\&quot;text\\&quot;,\\&quot;width\\&quot;:\\&quot;55px\\&quot;,\\&quot;height\\&quot;:\\&quot;27px\\&quot;,\\&quot;top\\&quot;:\\&quot;151px\\&quot;,\\&quot;left\\&quot;:\\&quot;86px\\&quot;,\\&quot;zIndex\\&quot;:\\&quot;1\\&quot;,\\&quot;svg\\&quot;:\\&quot;&lt;svg width=\\\\\\&quot;54.9375\\\\\\&quot; height=\\\\\\&quot;27.09375\\\\\\&quot; viewBox=\\\\\\&quot;0 0 54.9375 27.09375\\\\\\&quot; xmlns=\\\\\\&quot;http:\/\/www.w3.org\/2000\/svg\\\\\\&quot; xmlns:xlink=\\\\\\&quot;http:\/\/www.w3.org\/1999\/xlink\\\\\\&quot;&gt;&lt;g id=\\\\\\&quot;0.7882792934370437\\\\\\&quot;&gt;&lt;text fill=\\\\\\&quot;#FF0000\\\\\\&quot; stroke=\\\\\\&quot;none\\\\\\&quot; stroke-width=\\\\\\&quot;0\\\\\\&quot; stroke-linecap=\\\\\\&quot;round\\\\\\&quot; stroke-linejoin=\\\\\\&quot;round\\\\\\&quot; x=\\\\\\&quot;\\\\\\&quot; y=\\\\\\&quot;\\\\\\&quot; text-anchor=\\\\\\&quot;start\\\\\\&quot; font-size=\\\\\\&quot;24px\\\\\\&quot; font-family=\\\\\\&quot;arial\\\\\\&quot; data-textcurve=\\\\\\&quot;1\\\\\\&quot; data-itemzoom=\\\\\\&quot;1 1\\\\\\&quot; data-textspacing=\\\\\\&quot;0\\\\\\&quot;&gt;&lt;textPath xmlns:xlink=\\\\\\&quot;http:\/\/www.w3.org\/1999\/xlink\\\\\\&quot; xlink:href=\\\\\\&quot;http:\/\/138.68.62.219\/Buy-Hanes-T-shirt-PC61LS#textPath-item-0\\\\\\&quot;&gt;&lt;tspan dy=\\\\\\&quot;0\\\\\\&quot;&gt;Hello&lt;\/tspan&gt;&lt;\/textPath&gt;&lt;\/text&gt;&lt;\/g&gt;&lt;defs&gt;&lt;path id=\\\\\\&quot;textPath-item-0\\\\\\&quot; d=\\\\\\&quot;M 0.125 22.117808976867764 A 3093.9720937064453 3093.9720937064453 0 0 1 54.124314613414626 22.117808976867764\\\\\\&quot;&gt;&lt;\/path&gt;&lt;\/defs&gt;&lt;\/svg&gt;\\&quot;,\\&quot;rotate\\&quot;:0,\\&quot;text\\&quot;:\\&quot;Hello\\&quot;,\\&quot;color\\&quot;:\\&quot;#FF0000\\&quot;,\\&quot;fontFamily\\&quot;:\\&quot;arial\\&quot;,\\&quot;align\\&quot;:\\&quot;center\\&quot;,\\&quot;outlineC\\&quot;:\\&quot;none\\&quot;,\\&quot;outlineW\\&quot;:0}} 

Когда я прочитал с PHP эти данные, это то, что я вижу ($tmp=$products[0]['design_file']; print_r($tmp);):

"{\\"front\\":{\\"0\\":{\\"type\\":\\"text\\",\\"width\\":\\"55px\\",\\"height\\":\\"27px\\",\\"top\\":\\"151px\\",\\"left\\":\\"86px\\",\\"zIndex\\":\\"1\\",\\"svg\\":\\"<svg width=\\\\\\"54.9375\\\\\\" height=\\\\\\"27.09375\\\\\\" viewBox=\\\\\\"0 0 54.9375 27.09375\\\\\\" xmlns=\\\\\\"http:\/\/www.w3.org\/2000\/svg\\\\\\" xmlns:xlink=\\\\\\"http:\/\/www.w3.org\/1999\/xlink\\\\\\"><g id=\\\\\\"0.7882792934370437\\\\\\"><text fill=\\\\\\"#FF0000\\\\\\" stroke=\\\\\\"none\\\\\\" stroke-width=\\\\\\"0\\\\\\" stroke-linecap=\\\\\\"round\\\\\\" stroke-linejoin=\\\\\\"round\\\\\\" x=\\\\\\"\\\\\\" y=\\\\\\"\\\\\\" text-anchor=\\\\\\"start\\\\\\" font-size=\\\\\\"24px\\\\\\" font-family=\\\\\\"arial\\\\\\" data-textcurve=\\\\\\"1\\\\\\" data-itemzoom=\\\\\\"1 1\\\\\\" data-textspacing=\\\\\\"0\\\\\\"><textPath xmlns:xlink=\\\\\\"http:\/\/www.w3.org\/1999\/xlink\\\\\\" xlink:href=\\\\\\"http:\/\/138.68.62.219\/Buy-Hanes-T-shirt-PC61LS#textPath-item-0\\\\\\"><tspan dy=\\\\\\"0\\\\\\">Hello<\/tspan><\/textPath><\/text><\/g><defs><path id=\\\\\\"textPath-item-0\\\\\\" d=\\\\\\"M 0.125 22.117808976867764 A 3093.9720937064453 3093.9720937064453 0 0 1 54.124314613414626 22.117808976867764\\\\\\"><\/path><\/defs><\/svg>\\",\\"rotate\\":0,\\"text\\":\\"Hello\\",\\"color\\":\\"#FF0000\\",\\"fontFamily\\":\\"arial\\",\\"align\\":\\"center\\",\\"outlineC\\":\\"none\\",\\"outlineW\\":0}} 

Если я это сделать:

$tmp=$products[0]['design_file']; 
$info=json_decode($tmp); 
print_r($info); 

Это дает мне Null. Как я могу вернуть свой массив из этого беспорядка?

Javascript отправка:

jQuery(document).triggerHandler("before.addtocart.design", datas); 
var finaldata=JSON.stringify(datas); 
    jQuery.ajax({ 
    url: 'index.php?route=checkout/cart/add', //URL TO CONTROL FUNCTION add() 
    type: 'post', 
    data: 'product_id=' + product_id + '&quantity=' + q+"&option['options']="+finaldata, 

Читайте в Php

if (isset($this->request->post['option'])) { 
      $option = array_filter($this->request->post['option']); 

Pass для просмотра

$data['products'][] = array(
       'design_file'=>$product['design_file'], 
... 
$tmp=$products[0]['design_file']; 
+0

Ваша проблема заключается в том, что вы делаете _not_ сохранение содержимого, которое вы действительно хотите в MySQL, но что-то сбежало. Так что вопрос: _why_? Нам нужен ваш код для этого ... _ не пытайтесь исправить симптом, исправить причину! _ – arkascha

+0

Как вы отправляете эти данные в первую очередь? –

+0

@arkascha @ rocket-hazmat .ok thereis js 'var finaldata = JSON.stringify (datas); данные: 'product_id =' + product_id + '& quantity =' + q + "& option ['options'] =" + finaldata, // в ajax body' есть сохранение в mysql 'if (isset ($ this-> request-> сообщение [ 'вариант'])) { \t \t \t \t $ опция = array_filter ($ this-> request-> сообщение [ 'вариант']); // далее стандартная OpenCart code' вот как я прочитал: '$ данных [ 'продукты'] [] = массив ( \t \t \t \t \t 'design_file' => $ продукта [ 'design_file'] ' в TPL файле '$ TMP = $ продукты [0] [ 'design_file ']; ' – tttaaabbb

ответ

0

Вы можете быть хранить неверные данные в формате JSON. Посмотрите на этих страницах (некоторые полезные ресурсы прямо из PHP документации):

PS .: Второе звено связано с параметром options, используемого в json_encode. Вы можете составить те ценности, как вы хотите, так же, как в примере ниже:

$obj = [ 
    "prop1" => 123, 
    "prop2" => [ 
    "prop2.1" => "Value A", 
    "prop2.2" => [1, 2, 3, 4, 5] 
    ] 
]; 

$jsonContent = json_encode($obj, JSON_PRETTY_PRINT | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP); 

Кстати, вы можете отправить ваш JavaScript объекты на сервер, используя параметр contentType: 'application/json' в вызове функции $.ajax. Это позволит вам обрабатывать данные запроса из этого HTTP-запроса как объекта PHP, как и должно быть.

Используйте PHP для сериализации содержимого JSON, чтобы сохранить его в базе данных, вместо обхода строки непосредственно из атрибутов запроса.

+0

Я сделал, как вы сказали, это сработало, но только для первого lvl, '\ '' все еще здесь, и я не могу декодировать весь объект '$ tmp = $ products [ 0] ['design_file']; $ info = json_decode ($ tmp, true); // WORKS $ info = json_decode (stripslashes ($ info ['options'])); // DOESNT' – tttaaabbb

+0

Вы были правыми проблемами в данных обертки в json.Если вы заинтересовались 'var finaldata = {'product_id': product_id, 'quantity': q, 'option': {'options': datas // I HAD JSON.stringify (datas)}' – tttaaabbb

0

Здесь что-то действительно испортилось. Во-первых, ваш первоначальный JSON недействителен. Как-то у него уже есть лишние косые черты.

Проверьте здесь: Issue with JSON.stringify adding a extra \ and "" to my Json object. Может быть, здесь: JSON.stringify escaping without need

Также отсутствует в самом конце строки JSON } (она должна быть }}} три закрывающих скобок).

Во-вторых, я предполагаю, что перед тем, как вы вставили его в базу данных, вы сбежали от него (так вот, как вы получили еще больше слэш), и вы сделали htmlspecialchars(). Учитывая это, вы можете разобрать его в объекте.

$info = json_decode(stripslashes(htmlspecialchars_decode($tmp.'}'))); 
+0

пропущенный '{«Вероятно, моя ошибка, я переработал способ обертывания данных в js, ' var finaldata = { ' product_id ': product_id, ' количество ': q, ' option ': { ' options ' : JSON.stringify (данные) }} данные: FinalData, ' сразу после того, я был в состоянии сделать это ' '

  
результат: – tttaaabbb

+0

Вы должны также' htmlspecialchars_decode() ', так как двойные кавычки закодированы в' '". Но это не настоящее решение ... –

+0

После того как я декодировал root json, осталось немного, мне удалось это сделать: '$ info = json_decode ($ tmp, true); print_r (($ info ['options'])); 'result ' {"product_id": "176", "colors": {"0": "000000"}, "print": {"sizes": " {\ "front \": {\ "width \" ... 'Я не могу декодировать эту строку сейчас в вашем пути даже с помощью' htmlspecialchars_decode' – tttaaabbb

Смежные вопросы