Bu gösterimde ne tür?

8 Cevap php

Şöyle bir dize var:

[{text:"key 1",value:"value 1"},{text:"key 2",value:"value 2"},{text:"key 3",value:"value 3"}]

Ben bu AFAIK bu bir ASP. NET backend tarafından oluşturulan edilir gösterimde ne tür emin değilim. Bu JSON benzer bir çok benziyor ama bu çağıran json_decode () başarısız olur.

Birisi gösterimde bu tür bana biraz ışık getirmek ve bana PHP ile bir anahtar / değer diziye ayrıştırmak için verimli bir yol sağlayabilir?

8 Cevap

Herhangi bir şekilde çıkışını değiştirebilirim? Anahtar adları alıntı normalde ayrıştırmak için izin görünüyor:

    $test = '[{"text":"key 1","value":"value 1"},{"text":"key 2","value":"value 2"},{"text":"key 3","value":"value 3"}]';

    var_dump(json_decode($test));

Bu örnek JSON bir üst olan, YAML geçerlidir. YAML için at least 3 PHP libraries var gibi görünüyor.

Bu gerçektir YAML ise, bir regex aracılığıyla çalışan ve JSON kütüphanede atma yerine, gerçek bir YAML kütüphaneyi kullanarak daha iyiyiz. YAML, ASP.NET backend kullanıyorsa, gezi hayatta kalmak için gitmiyor ki, (tırnaksız dizeleri dışında) diğer özellikler için desteği vardır.

Bu (JSON benzer) javascript sözdizimi gibi görünüyor. Düzenli ifadeler ayrıştırma için gitmek yoludur. '[' Ve ']' soyun, sonra ',' üzerinde ayrı. Sonra her nesneyi ayrı ayrıştırmak.

Bu özel bir biçimi gibi görünüyor. Başında ve sonunda [{ve}] sınırlayıcı değiştirin. Sonra patlayabilir "}, {" ve bu olsun:

text:"key 1",value:"value 1"
text:"key 2",value:"value 2"
text:"key 3",value:"value 3"

Bu noktada sizin değerleri ayıklamak için dizi ve kullanım preg_match'in her öğe üzerinde yineleme yapabilirsiniz.

Metin değeri olan endeks ve değeri olan - neredeyse dizi tarzı veri kapsayıcı bir tür gibi görünüyor.

$string = ....;
$endArray = array()
$string = trim($string,'[]');
$startArray = preg_split('/{.+}/'); 
// Array of {text:"key 1",value:"value 1"}, this will also skip empty conainers
foreach( $startArray as $arrayItem ) {
  $tmpString = trim($arrayItem,'{}');  // $tmp = text:"key 1",value:"value 1"
  $tmpArray = explode(',',$tmpString); // $tmpArray = ('text: "key 1"', 'value: "value 1"')
 $endArray[substr($tmpArray[0],7,strlen($tmpArray[0])-1)] = substr($tmpArray[1],7,strlen($tmpArray[1])-1);
}

json_decode() tarafından kabul edilirse JSON veri almak için, şu normal ifadeyi kullanabilirsiniz:

function json_replacer($match) {
  if ($match[0] == '"' || $match[0] == "'") {
    return $match;
  }
  else {
    return '"'.$match.'"';
  }
}

$json_re = <<<'END'
/ " (?: \\. | [^\\"] )* "     # double-quoted string, with escapes
| ' (?: \\. | [^\\'] )* '     # single-quoted string, with escapes
| \b [A-Za-z_] \w* (?=\s*:)   # A single word  followed by a colon
/x
END;

$json = preg_replace_callback($json_re, 'json_replacer', $json);

Maçı üst üste asla çünkü, bir dize içinde iki nokta üst üste bir kelime maç asla.


Ben de PHP için farklı JSON uygulamaları arasında bir karşılaştırma bulundu:

http://gggeek.altervista.org/sw/article_20061113.html

Ben kullandım, ama belki json_decode bir görünüm vermek asla.