2013-07-19 25 views
7

Kodlarım, json_decode'ın aldığım belirli bir dizede çalışmasını sağlamakta zorlanıyorum.PHP, JSON'taki geçersiz karakterler

bu topu çizgiye kadar daralmış var

:

"systemNotes [6]": "9 Ocak 2013 12:52 - Test Adı - Değişti Fatura Adresi 2 Kargo İlk Adına Gönderen: Kargo Soyadı: E-posta Adresi: Gönderim Adresi: Gönderim Adresi 2: Gönderim Şehir: Gönderim Posta/Posta: Nakliye Ülke: Gönderim Durumu: Telefon: Fatura Adı: Fatura Soyadı: Fatura Adresi: Fatura Adresi 2: Faturalandırma C "

Json'u bu sorudan kopyalayarak, sorun yeniden üretilemez - ancak orijinal json'un bir temsilci pasajı burada: http://codepad.org/ZzrC7rqQ - ve jsonlint.com bu koyarak veriyor:

Parse error on line 3: 
... "systemNotes[6]": "January 09, 2013 12 
-----------------------^ 
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[' 

geçersiz json var, öyle ki bu dize yanlış olan nedir?

DÜZENLEME Ben tam kod karşıdan karşıya gelecek bulmayı başardılar.

"systemNotes [6]": "Ocak + 09% 2C + 2013 +% 12 3A52 + PM ++ İlk + İsim ++ Değişti ++ Fatura + Adres + 2 + itibaren ++ ile + Kargo + İlk + İsim% 3A% 09 + Kargo + Son + Adı% 3A% 09 + E-posta + Adresi% 3A% 09 + Kargo + Adres% 3A +% 09 + Kargo + Adres + 2% 3A +% 09 + Kargo + Şehir% 3A +% 09 + Kargo + Posta% 2FPostal% 3A +% 09 + Kargo + Ülke% 3A +% 09 + Kargo + Devlet% 3A +% 09 + Telefon% 3A +% 09 + Fatura + İlk + Ad% 3A +% 09 + Fatura + Son + Adı% 3A +% 09 + Fatura + Adres% 3A +% 09 + Fatura + Adres + 2% 3A +% Bu yüzden belki sorun ben parse_str ne zaman geliyor ok gibi görünüyor 09 + Fatura + C"

, İşte kullanıyorum kod:

$response = apiConnection($data); 
parse_str($response, $parse); 
$each = json_decode($parse['data']); 
foreach($each as $key => $order){ 
    //do something 
} 
+0

nasıl dize topluyorsun? – aynber

+0

Bir API sorgusu alıyorum ve onu bir dizgi olarak bana gönderiyor. Daha sonra bir parse_str kullanarak onu bir dizide bırakıyorum. – Scott

+1

Dizenin UTF olmayan karakterleri olup olmadığını kontrol edebilir misiniz? –

cevap

8

Sorun, sekme karakterlerinin bir dizenin içinde geçerli olmamasıdır.

http://codepad.org/8fnQphkS gibi sekme karakterlerini kaldırma ve bunu jsonlint.com adresinden kullanarak geçerli json'u göreceksiniz.

sekme karakteri bir dize içinde eğer öncelenmelidir karakterlerden biri olarak adıyla dışarı denir http://www.ietf.org/rfc/rfc4627.txt?number=4627 özel bölüm 2.5 de JSON için teknik özelliklerine bakın.

DÜZENLEME:

İşte

olan tüm sekmeleri ve birden boşlukları çıkarmak ve tek boşluk karakteriyle bunları değiştirmenin bir yolu:

$data = preg_replace('/[ ]{2,}|[\t]/', ' ', trim($data)); 
+0

Daha önce json * 'un şifresini çözmekten daha iyi olur * daha sonra url kodlamasını kaldırır. –

+1

'$ data = preg_replace ('/ [\ s] + | [\ t] /', '', trim ($ data));' - her türlü boş alan – ASDi

4

Böyle bir şey denediniz mi? o

$yourstring = preg_replace('/[^(\x20-\x7F)]*/','', $yourstring); 
-1

json_decode için ikinci parametre olarak true geçirerek deneyin dize temizlemeye yardımcı olacaktır. Documentation'a göre, ikinci bir argümanı doğru olan bir nesne yerine bir ilişkisel dizi döndürecektir.

$each = json_decode($parse['data'], true); 
+0

Bu bayrak dizisi veya std sınıfı hakkında bilgi almaktır. – HMagdy

İlgili konular