首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript从PHP回显抛出错误解析JSON,AJAX解析工作正常

问Javascript从PHP回显抛出错误解析JSON,AJAX解析工作正常
EN

Stack Overflow用户
提问于 2020-08-20 17:39:35
回答 1查看 39关注 0票数 0

在页面加载时,我遇到了解析从php返回的JSON字符串的问题。奇怪的是,如果我对同一个函数发出ajax请求,它就会进行分析,而不会出现任何错误。

当我尝试这样做的时候,问题就发生了。

代码语言:javascript
复制
JSON.parse('{"products":[{"id":"1","name":"Batata Frita ","description":"<p>Batata ta<strong> frita&nbsp;<\/strong><strong>pizza<\/strong><\/p>","short_description":"Batata ta frita","type":"food","category_id":"1","price":"15.00","inventory":"100","image":"\\tmp\\catalog\\productmenu\\batata_frita_sequinhaaa_1.jpg","options":"[{\"is_delete\":\"\",\"previous_type\":\"\",\"previous_group\":\"\",\"id\":\"1\",\"option_id\":1,\"title\":\"Molhos\",\"type\":\"drop_down\",\"is_require\":\"1\",\"values\":[{\"option_type_id\":0,\"is_delete\":\"\",\"title\":\"Ketchup\",\"price\":\"5\",\"sku\":\"\",\"sort_order\":\"\"}]},{\"is_delete\":\"\",\"previous_type\":\"\",\"previous_group\":\"\",\"id\":\"2\",\"option_id\":2,\"title\":\"Adicionais\",\"type\":\"checkbox\",\"is_require\":\"1\",\"values\":{\"1\":{\"option_type_id\":1,\"is_delete\":\"\",\"title\":\"Cebola\",\"price\":\"2\",\"sku\":\"\",\"sort_order\":\"\"},\"2\":{\"option_type_id\":2,\"is_delete\":\"\",\"title\":\"Queijo\",\"price\":\"5\",\"sku\":\"\",\"sort_order\":\"\"}}},{\"is_delete\":\"\",\"previous_type\":\"\",\"previous_group\":\"\",\"id\":\"3\",\"option_id\":3,\"title\":\"Teste\",\"type\":\"field\",\"is_require\":\"1\",\"price\":\"5\",\"price_type\":\"fixed\",\"sku\":\"\",\"max_characters\":\"\"},{\"is_delete\":\"\",\"previous_type\":\"\",\"previous_group\":\"\",\"id\":\"4\",\"option_id\":4,\"title\":\"Hor\\u00e1rio de entrega\",\"type\":\"date_time\",\"is_require\":\"1\",\"price\":\"10\",\"sku\":\"\"}]","barcode":"77373737737","store_ids":"2","seller_id":"67","status":"1","image_path":"http:\/\/192.100.2.109\/test\/media\/\\tmp\\catalog\\productmenu\\batata_frita_sequinhaaa_1.jpg"},{"id":"2","name":"Pizza","description":"<p>Pizza 30cm<\/p>","short_description":"Pizza 30cm","type":"food","category_id":"2","price":"44.00","inventory":"200","image":"\\tmp\\catalog\\productmenu\\pizzadem.jpg","options":"[{\"is_delete\":\"\",\"previous_type\":\"\",\"previous_group\":\"\",\"id\":\"1\",\"option_id\":1,\"title\":\"Sabor 1\",\"type\":\"drop_down\",\"is_require\":\"1\",\"values\":[{\"option_type_id\":0,\"is_delete\":\"\",\"title\":\"Calabresa\",\"price\":\"10\",\"sku\":\"\",\"sort_order\":\"\"},{\"option_type_id\":1,\"is_delete\":\"\",\"title\":\"Muzzarela\",\"price\":\"5\",\"sku\":\"\",\"sort_order\":\"\"}]},{\"is_delete\":\"\",\"previous_type\":\"\",\"previous_group\":\"\",\"id\":\"2\",\"option_id\":2,\"title\":\"Sabor 2\",\"type\":\"drop_down\",\"is_require\":\"1\",\"values\":{\"2\":{\"option_type_id\":2,\"is_delete\":\"\",\"title\":\"Bacon\",\"price\":\"15\",\"sku\":\"\",\"sort_order\":\"\"},\"3\":{\"option_type_id\":3,\"is_delete\":\"\",\"title\":\"Muzzarela\",\"price\":\"10\",\"sku\":\"\",\"sort_order\":\"\"}}}]","barcode":"324324","store_ids":"2","seller_id":"67","status":"1","image_path":"http:\/\/192.100.2.109\/test\/media\/\\tmp\\catalog\\productmenu\\pizzadem.jpg"},{"id":"3","name":"Agua","description":"<p>Agua 500ml<\/p>","short_description":"Agua 500ml","type":"drink","category_id":"3","price":"5.00","inventory":"200","image":"\\tmp\\catalog\\productmenu\\Download.jpg","options":null,"barcode":"324324234234","store_ids":"2","seller_id":"67","status":"1","image_path":"http:\/\/192.100.2.109\/test\/media\/\\tmp\\catalog\\productmenu\\Download.jpg"}],"categories":[{"id":"1","name":"Aperitivos","icon":"A","sort_order":"0","seller_id":"67"},{"id":"2","name":"Pizzas","icon":"P","sort_order":"1","seller_id":"67"},{"id":"3","name":"Bebidas","icon":"B","sort_order":"3","seller_id":"67"}]}')

上面的JSON字符串来自PHP,如下所示:

代码语言:javascript
复制
function initializeData() {
 initialData = JSON.parse('<?php echo Mage::helper('module/endpoint')->getData(); ?>')
 ...

即使JSON是有效的和经过测试的( JSON Validator ),它还是返回这个错误:

代码语言:javascript
复制
VM3617:1 Uncaught SyntaxError: Unexpected token c in JSON at position 248
at JSON.parse (<anonymous>)
at <anonymous>:1:6

但是,如果向我的服务器发出ajax请求并对其进行解析(返回的数据是完全相同的字符串):

代码语言:javascript
复制
jQuery.ajax({
  type: "POST",
  url: '<?php echo Mage::getUrl('module/enpoint/getData') ?>',
  data: {id: sellerId, store_id: storeId},
  success: function (data) {
      data = JSON.parse(data)
    ...

它工作正常,没有任何错误。

我是不是漏掉了什么?这种行为的目的是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-20 17:53:25

我是不是漏掉了什么?

处理字符串时的一个常见概念是转义序列。这些是表示单个字符的多字符序列.

当你嵌套有这个概念的多个“语言”时,事情就变得棘手了。在您的例子中: JSON和JavaScript字符串文本。

这是有效的JSON:

代码语言:javascript
复制
{"value": "\\c"}

序列"\\c"由JSON解析器处理,并将其转换为值\c。在JSON中,\\是单个\的转义序列。

但是,如果将相同的值放入JavaScript字符串文本中,则会开始崩溃:

代码语言:javascript
复制
'{"value": "\\c"}'

由于\也是字符串文本中的转义字符,因此从此字符串文本创建的字符串值为:

代码语言:javascript
复制
{"value": "\c"}

与JSON一样,在JavaScript字符串中,\\是单个\的转义序列。

如果这个值现在传递给JSON解析器,它会看到"\c",这不是一个有效的转义序列,因此解析器会抛出一个错误。

但是如果向我的服务器发出ajax请求并解析它..。它工作正常,没有任何错误。

因为在本例中没有字符串文本。传递给JSON.parse的字符串值实际上包含在JSON中有效的字符序列\\c。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63510487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档