JSON解码,更新字段并对其进行编码再次改变了json构造

时间:2013-10-30 16:22:49

标签: php utf-8 json

我在mysql单元格中获得了以下json代码:

{
"0ba9f1d1-787c-4d8e-a820-0c973bbd20fb":  {
    "0":  {
        "value": "Alex"
     }
},
"9a7df867-1c25-4e15-b0dd-1d20031c31fb":  {
    "0":  {
        "value": "Άλέξανδρος Γιόου"
    }
},
"659d5d3d-ac12-4f17-91c0-334fbd4f3538":  {
    "option":  {
        "0": "0",
        "1": "0"
    },
    "select": "1"
  }
}

我想更新php中的一些值。 我尝试使用以下代码,但我发现了一些意想不到的结果。

$check = mysql_query("SELECT `elements` FROM `test_zoo_item` WHERE `id` = 34839");
$decodedelements = json_decode($elements, true);
$decodedelements['0ba9f1d1-787c-4d8e-a820-0c973bbd20fb'][0]['value'] = "Test";
$decodedelements['9a7df867-1c25-4e15-b0dd-1d20031c31fb'][0]['value'] = "Γιώργος";
$decodedelements['659d5d3d-ac12-4f17-91c0-334fbd4f3538']['option'][0] = "3";
$newelements = json_encode($decodedelements);
mysql_query("UPDATE `test_zoo_item` SET `elements`='$newelements' WHERE `id`=34839");

我更新的单元格是:

{
"0ba9f1d1-787c-4d8e-a820-0c973bbd20fb": [{
    "value": "Alex"
}],
"9a7df867-1c25-4e15-b0dd-1d20031c31fb": [{
    "value": "u00ce...fu0082"
}],
"659d5d3d-ac12-4f17-91c0-334fbd4f3538": {
    "option": ["0", "0"],
    "select": "1"
}
}

是否有可能帮助我解决以下问题?

  • "0": {"value": "Alex"}已更改为[{"value": "Alex"}]
  • "value": "Άλέξανδρος Γιόου"已更改为"value": "u00c....cfu0082"
  • "option": {"0": "0","1": "0"}已更改为"option": ["0", "0"]

2 个答案:

答案 0 :(得分:1)

可以使用JSON_FORCE_OBJECT选项停用阵列转换(您的第一个和最后一个示例)。第二个例子看起来像unicode用于编码。可以使用JSON_UNESCAPED_UNICODE

禁用此功能
$newelements = json_encode( $decodedelements, JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE );

答案 1 :(得分:1)

  
      
  • "0": {"value": "Alex"}已更改为[{"value": "Alex"}]
  •   
  • "option": {"0": "0","1": "0"}已更改为"option": ["0", "0"]
  •   

这是因为PHP中连续数字索引的数组相当于JSON中的[]数组,json_encode对此进行编码。如果您想强制对象,那么JSON_FORCE_OBJECT

  
      
  • "value": "Άλέξανδρος Γιόου"已更改为"value": "u00c....cfu0082"
  •   

那是因为json_encode将非ASCII字符编码为\u....转义序列,这本身就很好。然后,你不是 SQL转义字符串,所以MySQL过滤掉反斜杠。您需要SQL转义值或使用预准备语句。