【问题标题】:JSON decode, updating fields and encode it again altered the json constructionJSON解码,更新字段并再次对其进行编码改变了json结构
【发布时间】:2013-10-30 16:22:49
【问题描述】:

我在一个 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.ini 中的一些值。 我尝试使用以下代码,但得到了一些意想不到的结果。

$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"]

【问题讨论】:

    标签: php utf-8 json


    【解决方案1】:

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

    $newelements = json_encode( $decodedelements, JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE );
    

    【讨论】:

    • 第一个没问题,但我现在得到这样的 utf-8:value":"ΧÏήÏÏÎ¿Ï ÎαÏαγκÏÏ"
    • @Alexandros 呃哦...然后阅读:Handling Unicode Front To Back In A Web App
    • 不!数据库和 html 的一切都可以。 UTF-8 在更新其值之前没有问题...
    • 可能是因为我已经在一个文件中使用了 utf8_encode 来获取新值? file_put_contents($datafile, utf8_encode($data));
    • @Alexandros 那些转义的 unicode 符号对你来说真的是个问题吗?当再次使用json_decode() 时,它们会被解析为“真实”字符。
    【解决方案2】:
    • "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 转义或使用准备好的语句。

    猜你喜欢
    • 2021-11-24
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多