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


JSON encode in Javascript and decode in PHP

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

我的阿贾克斯电话是

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 而不是作为模式中的字段会变得非常复杂。当第二个炸弹时,$pat的值为 NULL。

我强烈建议通过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);

您有很多问题,但首先是您启用了魔术报价。这就是为什么你有所有这些反斜杠。你粗暴地试图用str_replace"修复"它是一个坏主意,因为除了"之外,还有其他事情会被魔术行情所逃避。您应该在php.ini文件中找到该设置,并将其禁用。"寄存器全局"也是如此,这是一个非常不安全的功能。改为引用$_GET['data']

有了这个,我建议的下一件事是使用POST而不是GET。这意味着您不必弄乱转义数据,因为这总是伴随着搞砸数据的风险。

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