2012-10-16 16 views
12

Mam duży problem z publikowaniem danych za pośrednictwem jQuery Ajax jako JSON na moim serwerze. JSLint twierdzi, że dane są prawidłowe, a typ zawartości żądania jest ustawiony na application/x-www-form-urlencoded; charset=UTF-8. Serwer działa na PHP 5.2.11, więc nie mogę używać json_last_error().Json_decode ze specjalnymi znakami

Próbowałem url_decode, utf8_decode i html_entities_decode, ale nic nie działa.

var_dump(json_decode($jdata)); zwraca zero, ale jeśli zrobię var_dump($jdata) wszystko wygląda OK. $jdata to dane o wpisie: $jdata = $this->input->post('requestdata');.

Oto niektóre dane przykładowy post chwycić z 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" 
     } 
    ] 
} 

Edit:

Próbowałem to teraz:

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

Wynikiem jest:

string (338) "{" numer_projektu ":" 4444 "," opis projektu ":" 4444 "," articles ": [{" position ": 1," article_id ": 676," online_text ":" ### Behälter; Zespół I-III nach indiv. Stückliste, Sprache: DE - Sprache: de "}, {" position ": 2," article_id ": 681," online_text ":" ### Behälter; Zespół I-III nach indiv. Stückliste, Sprache: ### - Sprache: en "}]}" NULL

wklejając ciąg JSON kierować do źródła PHP to działa, ale coraz to z nie słupek!

+0

To będzie pracować dla Ciebie: http://stackoverflow.com/ a/12884807/1226894 – Baba

+0

możliwy duplikat [json \ _decode zwraca null w php] (http://stackoverflow.com/questions/12884802/json-decode-is-returning-null-in-php) – Baba

+0

Czy jesteś pewien? że masz ciąg znaków UTF8 po stronie serwera? Spróbuj 'var_dump (json_decode (utf8_encode ($ jdata)));' – ThiefMaster

Odpowiedz

9

Występują błąd z powodu nowej linii w swojej ciąg

$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); 

Wyjście

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

zrobiłeś mój dzień! – fillibuster

+0

@grolle good to know .. thanks :) – Baba

9

Głosowanie dla nowej linii zbyt

json_decode_nice + zachować linebreaks:

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); 
} 

Jeśli chcesz zachować linebreaks po prostu uciec slash.

Nie trzeba kodowanie UTF-8, czy wszystko jest ustawione na UTF-8 (nagłówek, połączenie db, etc)

+2

Nie zapomnij dołączyć \ t do listy niegrzecznych postaci.Wydaje się to być problemem dla PHP <5.4. – mtutty

+0

@mtutty, dzięki za ten komentarz! – Hafenkranich

+1

@RaphaelWeber Dziękuję, Bro, uratowałeś mój czas –

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