使用特殊字符Json_decode

2022-08-31 00:39:34

我遇到了一个大问题,通过jQuery Ajax将数据作为JSON发布到我的服务器。JSLint 表示数据正常,并且请求的内容类型设置为 。服务器在 PHP 5.2.11 上运行,所以我不能使用 .application/x-www-form-urlencoded; charset=UTF-8json_last_error()

我尝试了url_decode,utf8_decode和html_entities_decode,但似乎没有任何效果。

var_dump(json_decode($jdata));返回 null,但如果我做一个一切看起来都OK。 是帖子数据:。var_dump($jdata)$jdata$jdata = $this->input->post('requestdata');

以下是一些来自Firebug的帖子数据抓取示例:

{
    "projectnumber": "345",
    "projecdescription": "345",
    "articles": [
        {
            "position": 1,
            "article_id": 677,
            "online_text": "3 Behälter; Band I-III nach indiv. Stückliste, Sprache: DE - Sprache: de"
        },
        {
            "position": 2,
            "article_id": 678,
            "online_text": "2 Behälter; Band I-III nach indiv. Stückliste, Sprache: ### - Sprache: en"
        }
    ]
}

编辑:

我现在试过了:

$string = $this->input->post('requestdata');
var_dump($string);
$json = preg_replace('/,\s*([\]}])/m', '$1', utf8_encode($string));
$json = json_decode($json);
var_dump($json);

结果是:

string(338) “{”projectnumber“: ”4444“, ”projecdescription“: ”4444“, ”articles“: [{”position“:1, ”article_id“: 676, ”online_text“: ”### Behälter;乐队 I-III 纳赫 indiv.Stückliste, Sprache: DE - Sprache: de“}, {”position“:2, ”article_id“: 681, ”online_text“: ”### Behälter;乐队 I-III 纳赫 indiv.Stückliste, Sprache: ### - Sprache: en“}]}” NULL

通过将JSON字符串直接粘贴到PHP源代码中,它可以工作,但从post获取它却不起作用!


答案 1

由于字符串中有新行,您遇到了错误

$string = '{"projectnumber" : "4444","projecdescription" : "4444", "articles" : [{"position":1, "article_id" : 676, "online_text" : "### Behälter; Band I-III nach indiv. Stückliste, Sprache: DE 
 - Sprache: de"},{"position":2, "article_id" : 681, "online_text" : "### Behälter; Band I-III nach indiv. Stückliste, Sprache: ### 
 - Sprache: en"}]}';


$string = preg_replace("/[\r\n]+/", " ", $string);
$json = utf8_encode($string);
$json = json_decode($json);
var_dump($json);

输出

object(stdClass)[1]
  public 'projectnumber' => string '4444' (length=4)
  public 'projecdescription' => string '4444' (length=4)
  public 'articles' => 
    array
      0 => 
        object(stdClass)[2]
          public 'position' => int 1
          public 'article_id' => int 676
          public 'online_text' => string '### Behälter; Band I-III nach indiv. Stückliste, Sprache: DE   - Sprache: de' (length=78)
      1 => 
        object(stdClass)[3]
          public 'position' => int 2
          public 'article_id' => int 681
          public 'online_text' => string '### Behälter; Band I-III nach indiv. Stückliste, Sprache: ###   - Sprache: en' (length=79)

答案 2

也为换行符投票

json_decode_nice + 保留换行符:

function json_decode_nice($json, $assoc = TRUE){
    $json = str_replace("\n","\\n",$json);
    $json = str_replace("\r","",$json);
    $json = preg_replace('/([{,]+)(\s*)([^"]+?)\s*:/','$1"$3":',$json);
    $json = preg_replace('/(,)\s*}$/','}',$json);
    return json_decode($json,$assoc);
}

如果要保留换行符,只需转义斜杠即可。

如果所有内容都设置为 utf-8(标头、数据库连接等),则不需要 utf-8 编码


推荐