2012-01-11 15 views
10

Próbuję odczytać plik .json z serwera WWW. JSON jestem otrzymaniu od serwera ocenia się nieważny w http://jsonlint.com/:Konwertuj nieprawidłowy json na poprawny json

{ 
    preOpen: "900", 
    preClose: "908", 
    mktOpen: "915", 
    mktClose: "1530", 
    corrOpen: "1540", 
    corrClose: "1600", 
    mktStatusCode: "3", 
    status: "MARKET OPEN", 
    time: "Jan 11, 2012 12:32:14", 
    data: [ 
     { 
      name: "S&P CNX NIFTY Pre Open", 
      lastPrice: "4,863.15", 
      change: "13.60", 
      pChange: "0.28", 
      imgFileName: "S&P_CNX_NIFTY_Pre_Open_open.png" 
     }, 
     { 
      name: "S&P CNX NIFTY", 
      lastPrice: "4,871.15", 
      change: "21.60", 
      pChange: "0.45", 
      imgFileName: "S&P_CNX_NIFTY_open.png" 
     }, 
     { 
      name: "CNX NIFTY JUNIOR", 
      lastPrice: "8,940.05", 
      change: "91.90", 
      pChange: "1.04", 
      imgFileName: "CNX_NIFTY_JUNIOR_open.png" 
     }, 
     { 
      name: "BANK NIFTY", 
      lastPrice: "8,816.15", 
      change: "81.10", 
      pChange: "0.93", 
      imgFileName: "BANK_NIFTY_open.png" 
     }, 
     { 
      name: "INDIA VIX", 
      lastPrice: "24.18", 
      change: "0.18", 
      pChange: "0.75", 
      imgFileName: "INDIA_VIX_open.png" 
     }, 
     { 
      name: "CNX 100", 
      lastPrice: "4,729.25", 
      change: "25.05", 
      pChange: "0.53", 
      imgFileName: "CNX_100_open.png" 
     }, 
     { 
      name: "S&P CNX DEFTY", 
      lastPrice: "3,265.00", 
      change: "41.70", 
      pChange: "1.29", 
      imgFileName: "S&P_CNX_DEFTY_open.png" 
     }, 
     { 
      name: "S&P CNX 500", 
      lastPrice: "3,811.75", 
      change: "26.40", 
      pChange: "0.70", 
      imgFileName: "S&P_CNX_500_open.png" 
     }, 
     { 
      name: "CNX MIDCAP", 
      lastPrice: "6,548.20", 
      change: "80.65", 
      pChange: "1.25", 
      imgFileName: "CNX_MIDCAP_open.png" 
     }, 
     { 
      name: "NIFTY MIDCAP 50", 
      lastPrice: "1,937.20", 
      change: "21.30", 
      pChange: "1.11", 
      imgFileName: "NIFTY_MIDCAP_50_open.png" 
     }, 
     { 
      name: "CNX INFRA", 
      lastPrice: "2,273.60", 
      change: "8.50", 
      pChange: "0.38", 
      imgFileName: "CNX_INFRA_open.png" 
     }, 
     { 
      name: "CNX REALTY", 
      lastPrice: "207.85", 
      change: "8.10", 
      pChange: "4.06", 
      imgFileName: "CNX_REALTY_open.png" 
     }, 
     { 
      name: "CNX ENERGY", 
      lastPrice: "7,300.55", 
      change: "37.10", 
      pChange: "0.51", 
      imgFileName: "CNX_ENERGY_open.png" 
     }, 
     { 
      name: "CNX FMCG", 
      lastPrice: "10,308.90", 
      change: "10.90", 
      pChange: "0.11", 
      imgFileName: "CNX_FMCG_open.png" 
     }, 
     { 
      name: "CNX MNC", 
      lastPrice: "4,660.35", 
      change: "30.40", 
      pChange: "0.66", 
      imgFileName: "CNX_MNC_open.png" 
     }, 
     { 
      name: "CNX PHARMA", 
      lastPrice: "4,743.15", 
      change: "-4.15", 
      pChange: "-0.09", 
      imgFileName: "CNX_PHARMA_open.png" 
     }, 
     { 
      name: "CNX PSE", 
      lastPrice: "2,753.90", 
      change: "14.60", 
      pChange: "0.53", 
      imgFileName: "CNX_PSE_open.png" 
     }, 
     { 
      name: "CNX PSU BANK", 
      lastPrice: "2,847.95", 
      change: "22.80", 
      pChange: "0.81", 
      imgFileName: "CNX_PSU_BANK_open.png" 
     }, 
     { 
      name: "CNX SERVICE", 
      lastPrice: "5,933.65", 
      change: "21.65", 
      pChange: "0.37", 
      imgFileName: "CNX_SERVICE_open.png" 
     }, 
     { 
      name: "CNX IT", 
      lastPrice: "6,300.35", 
      change: "-31.40", 
      pChange: "-0.50", 
      imgFileName: "CNX_IT_open.png" 
     }, 
     { 
      name: "CNX SMALLCAP", 
      lastPrice: "2,981.80", 
      change: "49.85", 
      pChange: "1.70", 
      imgFileName: "CNX_SMALLCAP_open.png" 
     }, 
     { 
      name: "CNX 200", 
      lastPrice: "2,432.05", 
      change: "14.35", 
      pChange: "0.59", 
      imgFileName: "CNX_200_open.png" 
     }, 
     { 
      name: "CNX AUTO", 
      lastPrice: "3,497.60", 
      change: "4.05", 
      pChange: "0.12", 
      imgFileName: "CNX_AUTO_open.png" 
     }, 
     { 
      name: "CNX MEDIA", 
      lastPrice: "1,147.30", 
      change: "23.35", 
      pChange: "2.08", 
      imgFileName: "CNX_MEDIA_open.png" 
     }, 
     { 
      name: "CNX METAL", 
      lastPrice: "2,746.95", 
      change: "60.60", 
      pChange: "2.26", 
      imgFileName: "CNX_METAL_open.png" 
     } 
    ] 
} 

Jego wyświetlając następujący wynik testu:

Parse error on line 1: 
{ preOpen: "900",  
-----^ 
Expecting 'STRING', '}' 

jaki sposób można przekonwertować go do prawidłowych JSON przed parsowaniem go za pomocą PHP ??

+0

Klucze muszą być w cudzysłowie - więc preOpen: "900" musi być "preOpen": "900", i tak dalej. Nie wiem, jak to naprawić, jeśli nie masz kontroli nad źródłem json. Możesz użyć wyrażenia regularnego - poszukaj pojedynczego słowa przed dwukropkiem i umieść je w podwójnych cudzysłowach. –

Odpowiedz

7

Wszystkie keys (preOpen, preClose, ...) muszą być łańcuchami, więc potrzebują podwójnych cytatów.

{ 
    "preOpen": "900", 
    "preClose": "908", 
    ... 
} 

=== UPDATE ===

Jeśli masz nieprawidłową JSON-String można przekonwertować go z następującym skryptem:

$sInvalidJson = '{ 
    preOpen: "900", 
    preClose: "908" 
}'; 
$sValidJson = preg_replace("/(\n[\t ]*)([^\t ]+):/", "$1\"$2\":", $sInvalidJson); 

patrz również ten example.

(Ten skrypt działa tylko z nieprawidłową JSON opisanego powyżej, w przeciwnym razie wzór musi zostać zmieniona.)

=== UPDATE ===

$sInvalidJson = '{preOpen:"900",preClose:"908",mktOpen:"915",mktClose:"1530",corrOpen:"1540",corrClose:"1600",mktStatusCode:"3",status:"MARKET OPEN",time:"Jan 11, 2012 14:25:15",data:[{name:"S&P CNX NIFTY Pre Open",lastPrice:"4,863.15",change:"13.60",pChange:"0.28",imgFileName:"S&P_CNX_NIFTY_Pre_Open_open.png"},{name:"S&P CNX NIFTY",lastPrice:"4,847.85",change:"-1.70",pChange:"-0.04",imgFileName:"S&P_CNX_NIFTY_open.png"},{name:"CNX NIFTY JUNIOR",lastPrice:"8,917.00",change:"68.85",pChange:"0.78",imgFileName:"CNX_NIFTY_JUNIOR_open.png"},{name:"BANK NIFTY",lastPrice:"8,768.75",change:"33.70",pChange:"0.39",imgFileName:"BANK_NIFTY_open.png"},{name:"INDIA VIX",lastPrice:"24.61",change:"0.61",pChange:"2.54",imgFileName:"INDIA_VIX_open.png"},{name:"CNX 100",lastPrice:"4,707.85",change:"3.65",pChange:"0.08",imgFileName:"CNX_100_open.png"},{name:"S&P CNX DEFTY",lastPrice:"3,253.50",change:"30.20",pChange:"0.94",imgFileName:"S&P_CNX_DEFTY_open.png"},{name:"S&P CNX 500",lastPrice:"3,795.40",change:"10.05",pChange:"0.27",imgFileName:"S&P_CNX_500_open.png"},{name:"CNX MIDCAP",lastPrice:"6,524.90",change:"57.35",pChange:"0.89",imgFileName:"CNX_MIDCAP_open.png"},{name:"NIFTY MIDCAP 50",lastPrice:"1,926.55",change:"10.65",pChange:"0.56",imgFileName:"NIFTY_MIDCAP_50_open.png"},{name:"CNX INFRA",lastPrice:"2,262.05",change:"-3.05",pChange:"-0.13",imgFileName:"CNX_INFRA_open.png"},{name:"CNX REALTY",lastPrice:"207.70",change:"7.95",pChange:"3.98",imgFileName:"CNX_REALTY_open.png"},{name:"CNX ENERGY",lastPrice:"7,301.05",change:"37.60",pChange:"0.52",imgFileName:"CNX_ENERGY_open.png"},{name:"CNX FMCG",lastPrice:"10,235.35",change:"-62.65",pChange:"-0.61",imgFileName:"CNX_FMCG_open.png"},{name:"CNX MNC",lastPrice:"4,631.55",change:"1.60",pChange:"0.03",imgFileName:"CNX_MNC_open.png"},{name:"CNX PHARMA",lastPrice:"4,749.95",change:"2.65",pChange:"0.06",imgFileName:"CNX_PHARMA_open.png"},{name:"CNX PSE",lastPrice:"2,744.85",change:"5.55",pChange:"0.20",imgFileName:"CNX_PSE_open.png"},{name:"CNX PSU BANK",lastPrice:"2,841.10",change:"15.95",pChange:"0.56",imgFileName:"CNX_PSU_BANK_open.png"},{name:"CNX SERVICE",lastPrice:"5,900.60",change:"-11.40",pChange:"-0.19",imgFileName:"CNX_SERVICE_open.png"},{name:"CNX IT",lastPrice:"6,262.10",change:"-69.65",pChange:"-1.10",imgFileName:"CNX_IT_open.png"},{name:"CNX SMALLCAP",lastPrice:"2,963.90",change:"31.95",pChange:"1.09",imgFileName:"CNX_SMALLCAP_open.png"},{name:"CNX 200",lastPrice:"2,421.50",change:"3.80",pChange:"0.16",imgFileName:"CNX_200_open.png"},{name:"CNX AUTO",lastPrice:"3,484.30",change:"-9.25",pChange:"-0.26",imgFileName:"CNX_AUTO_open.png"},{name:"CNX MEDIA",lastPrice:"1,139.60",change:"15.65",pChange:"1.39",imgFileName:"CNX_MEDIA_open.png"},{name:"CNX METAL",lastPrice:"2,726.75",change:"40.40",pChange:"1.50",imgFileName:"CNX_METAL_open.png"}]}'; 
$sValidJson = preg_replace("/([{,])([a-zA-Z][^: ]+):/", "$1\"$2\":", $sInvalidJson); 

także tym updated example.

+0

Bardzo ładna odpowiedź. Działa bardzo dobrze, z wyjątkiem części "time:" 11 stycznia 2012 12:32:14 "," która jest zepsuta. – DKSan

+0

@DKSan: thx, zaktualizowałem swoją odpowiedź. – scessor

+0

Korzystam z następującego kodu bez powodzenia: '$ url = 'http: //abc/abc.json'; $ session = curl_init ($ url); curl_setopt ($ sesja, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv: 1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); curl_setopt ($ sesja, CURLOPT_POST, true); curl_setopt ($ session, CURLOPT_HEADER, false); curl_setopt ($ sesja, CURLOPT_RETURNTRANSFER, true); $ json = curl_exec (sesja $); echo $ json; echo "


"; $ sValidJson = preg_replace ("/ (\ n [\ t] *) ([^ \ t] +): /", "$ 1 \" $ 2 \ ":", $ json); echo $ sValidJson; 'Otrzymuję tę samą wydajność !!!! – Sandy505

2

Uważam, że prawidłowe ciągi JSON wymagają podwójnego cudzysłowu wokół wszystkich kluczowych nazw. To, co pokazujesz, jest poprawnym obiektem JavaScript, ale gdy jest ono uszeregowane w JSON, powinno zawierać podwójne cudzysłowy wokół wszystkich kluczy.

+0

Tak, używając 'JSON.stringify (eval ({preOpen:" 900 ", ....}))', zwracany jest prawidłowy JSON. @ Sandy505 Jednak używanie eval jest niebezpieczne, szczególnie jeśli dane pochodzą ze źródeł zewnętrznych, ponieważ nie wiesz, co może zostać przekazane. Równie dobrze może to być złośliwy kod wstrzyknięty na twoją stronę. W każdym razie to nie jest strona PHP. –

0

Nazwy właściwości muszą być cytowane. Zobacz przykład http://json.org/example.html. Zmieniłbym serwer, by produkował właściwy JSON.

Należy produkuje coś podobnego { "preOPen": "900", .... }

0

Yea, to zniekształcone - brakuje cudzysłowy wokół kluczowych nazwisk. Musisz przetworzyć go jako ciąg ... lub zmienić plik na serwerze.

2

Większość oferowanych rozwiązań ma wiele problemów, głównie z dwukropkami.

Napisałem funkcję json do tablicy, która rozwiązuje ten problem.

Sprawdza również nawiasy okrągłe wokół łańcucha json i usuwa go przed json_decode.

Oto funkcja:

function jsonDecode($string, $assoc=true, $fixNames=true){ 
    if(strpos($string, '(') === 0){ 
    $string = substr($string, 1, strlen($string) - 2); // remove outer (and) 
    } 
    if($fixNames){ 
    $string = preg_replace("/(?<!\"|'|\w)([a-zA-Z0-9_]+?)(?!\"|'|\w)\s?:/", "\"$1\":", $string); 
    } 
    return json_decode($string, $assoc); 
} 

także sprawdza spacji przed dwukropkiem i wyłącza je z nazwami zmiennych.

Oto przykład ciąg testowałem:

({stylu: "border: 5px stały różowy;", klasa: "test", "poprawna": "wartość", Test: true, var5: "niektórzy uciekli \" ciąg "})

Po konwersji.

Array 
(
    [style] => border: 5px solid pink; 
    [class] => test 
    [correct] => value 
    [test] => 1 
    [var5] => some escaped" string 
) 

tej pory wygląda kuloodporne

Daj mi znać, jeśli znajdziesz dziurę.