JSON在Javascript中编码并在PHP中解码

时间:2013-11-08 18:12:09

标签: javascript php ajax json

我在Javascript中创建一个对象,作为参数传递给PHP脚本。

var pattern = new Object();
pattern['@id'] = '';
pattern['@num'] = '';
pattern.cprop = new Object();
//pattern.aprop = new Object();
pattern['@id'] = id;
pattern['@num'] = pn;
pattern.cprop.$ = pb.find('input[name="subject"]').val() || '';
var json = {'pattern': pattern};

我的Ajax电话是

url: clr_url_base+'storepat.php?data='+encodeURIComponent($.toJSON(json))

在我的PHP脚本中,我使用

$pat = json_decode(str_replace ('\"','"', $data), true);
$prep = $pat["pattern"]["@id"];
$sense = $pat["pattern"]["@num"];
$cprop = $pat["pattern"]["cprop"]["$"];
//$aprop = $pat["pattern"]["aprop"]["$"];

这样可行,但是当我添加 aprop 值时,它不再有效。所有值都是字符串。关于出了什么问题的任何建议。

以下是两个JSON字符串:

{\"pattern\":{\"@id\":\"against\",\"@num\":\"1(1)\",\"cprop\":{\"$\":\"a person or thing (often abstract) opposed\"}}}
{\"pattern\":{\"@id\":\"against\",\"@num\":\"1(1)\",\"cprop\":{\"$\":\"a person or thing (often abstract) opposed\"},\"aprop\":{\"$\":\"verbs (to which \'against\' introduces idea of opposition); nouns denoting conflict\"}}}

第一个只有 cprop 的值,而第二个则添加 aprop 的值。请注意, aprop 具有单引号。正是这种数据似乎要求在Javascript中进行编码并在PHP中进行解码。第二枚炸弹。我有一个表单中的大约20个字段,因此手动创建JSON会变得非常复杂,而不是 pattern 中的字段。当第二枚炸弹时, $ pat 的值为NULL。

2 个答案:

答案 0 :(得分:1)

我强烈建议通过jQuery发布数据而不是传入查询字符串。为什么?因为那时你不必担心URL编码等等。

这可能在javascript / jQuery中看起来像这样。显然,对于任何类型的AJAX发送机制,这个概念基本相同。

$.ajax({
    type: 'POST',
    url: clr_url_base+'storepat.php?',
    contentType: 'application/json',
    dataType: 'json', // if you expect JSON in return
    data: json,  // your JSON string here
    success: // your success handler
    error: // your error handler
});

在PHP方面,由于您不处理表单编码数据,因此您需要阅读PHP的原始输入。幸运的是,这非常简单,将POST数据转换为PHP对象/数组非常简单。就这么简单:

$json = file_get_contents('php://input');
$variable = json_decode($json);

答案 1 :(得分:0)

您遇到了许多问题,但排名第一的是您启用了Magic Quotes。这就是为什么你有这些反斜杠。你用str_replace“修复”它的原始尝试是一个坏主意,因为除了"之外还有其他东西可以通过Magic Quotes逃脱。您应该在php.ini文件中找到该设置,并将其禁用。 “注册全局变量”也是如此,这是一个非常不安全的功能。改为参考$_GET['data']

有了这个,我建议的下一件事是使用POST而不是GET。这意味着你不必乱用数据,因为这总是带来搞砸它的风险。

您应该能够毫不费力地实施这些更改。