2014-09-22 10 views
10

Non riesco a trovare esattamente un riferimento a questo errore, ma YAML 1.2 dice che è un superset JSON e se utilizzo i caratteri tabulazione in un JSON lo considera come un errore.YAML come caratteri superset e TAB JSON

ad es.

"root": { 
     "key": "value" 
} 

(convalida in linea here dice che '\t' that cannot start any token)

so perché YAML non consente storicamente schede, ma come posso interpretare questo nel contesto di JSON-superset?

(ad esempio Is YAML non un superset reale o fa JSON anche non consentire le schede, o le specifiche ammette la presenza schede in questo caso, ma l'implementazione non c'è ancora?)

Grazie.

risposta

6

Le schede sono consentite in YAML, ma solo se la rientranza non è applicabile.

Secondo YAML 1.2 Section 5.5:

YAML riconosce due spazio bianco personaggi: spazio e tab.

I seguenti esempi useranno · per indicare gli spazi e per indicare schede. Tutti gli esempi possono essere convalidati utilizzando lo YAML Reference Parser ufficiale.

YAML ha uno stile di blocco e uno stile di flusso. In stile blocco, il rientro determina la struttura di un documento. Il seguente documento usa lo stile di blocco.

root: 
··key: value 

Validate

In stile flusso, i caratteri speciali indicano la struttura del documento. Il seguente documento equivalente utilizza lo stile del flusso.

{ 
→ root: { 
→ → key: value 
→ } 
} 

Validate

si può anche mescolare il rientro in grande stile di flusso.

{ 
→ root: { 
··→ key: value 
····} 
} 

Validate

Se stai mescolando blocco e flusso stile, tutta la parte stile flusso devono rispettare il rientro stile blocco.

root: 
··{ 
····key: value 
··} 

Validate

Ma è ancora possibile mescolare il vostro rientro all'interno della parte stile flusso.

root: 
··{ 
··→ key: value 
··} 

Validate

Se si dispone di un unico documento di valore, si può circondare il valore con tutti i tipi di spazi bianchi.

→ ··value··→ 

Validate

Il punto è, ogni documento JSON che viene analizzato come YAML metterà il documento in stile flusso (a causa della { o [ carattere iniziale) che supporta le schede, a meno che non si tratta di un singolo valore del documento JSON, nel qual caso YAML consente ancora il riempimento con spazi bianchi.

Se un parser YAML genera a causa di schede in un documento JSON, non è un parser valido.

Detto questo, l'esempio non funziona perché un valore di mappatura di stile blocco deve essere sempre rientrato se non si trova sulla stessa riga del nome di mapping.

root: { 
··key: value 
} 

è not valid, tuttavia

root: 
··{ 
····key: value 
··} 

è valid e

root: { key: value } 

è anche valid.

2

In base alle schede specification erano mai consentito. Pertanto, quando JSON viene utilizzato all'interno di YAML, non consente le schede.

Il problema si verifica quando pensiamo che JSON sia un sottoinsieme puro di YAML. Ma non è, secondo la sezione Relation to JSON nella specifica, ci sono alcune piccole cose, che impedisce a json di essere un puro sottogruppo di YAML.

Se vogliamo affrontare queste differenze, ciò di cui avremo bisogno è qualcosa come YSON, che è anche menzionato nelle specifiche.

Ma fortunatamente ci sono alcuni motori YAML che supportano le schede come rientri. Snakeyml è un esempio per questo.

7

So perché YAML storicamente non consente le schede, ma come posso interpretarlo nel contesto di JSON-superset?

Considerando il resto delle specifiche, possiamo solo concludere che il commento "superset" è impreciso. La specifica YAML è fondamentalmente incoerente nella Relation to JSON section:

YAML può quindi essere visto come un sovrainsieme naturale di JSON, offrendo migliore leggibilità umana e un modello più completa informazione. Questo è anche il caso nella pratica; ogni file JSON è anche un file YAML valido. Ciò semplifica la migrazione da JSON a YAML se/quando sono richieste le funzionalità aggiuntive .

L'RFC4627 di JSON richiede che le chiavi di mappatura semplicemente "DOVREBBERO" siano univoche, mentre YAML insiste sul fatto che "DEVE" essere. Tecnicamente, YAML pertanto è conforme alle specifiche JSON, scegliendo di trattare i duplicati come un errore. In pratica, poiché JSON è silenzioso sulla semantica di tali duplicati, gli unici file JSON portatili sono quelli con chiavi univoche, che sono quindi file YAML validi.

Nonostante affermando YAML come un "superset naturale JSON" e affermando che "ogni file JSON è anche un file YAML valida", la specifica nota subito alcune differenze per quanto riguarda l'unicità chiave. Probabilmente, anche le specifiche dovrebbero tenere conto delle differenze nell'uso delle schede per i rientri.

proposito, come il validatore implicita, YAML explicitly prohibits tabs as indentation characters:

Per mantenere la portabilità, caratteri di tabulazione non devono essere utilizzati in indentazione, poiché i sistemi diversi trattano schede diverso. Notare che gli editor più moderni possono essere configurati in modo che premendo il tasto di tabulazione si ottenga l'inserimento di un numero appropriato di spazi.

Questo è, naturalmente, più rigorosa della JSON specification, che afferma semplicemente:

Whitespace può essere inserito tra qualsiasi coppia di gettoni.

Quindi, per rispondere direttamente alle vostre domande ...

(cioè, non è YAML un superset reale o fa JSON anche non consentire le schede, o le specifiche ammette la presenza schede in questo caso, ma l'implementazione non c'è ancora?)

... YAML non è in realtà un superset, JSON non non non consentire le schede, mentre le specifiche YAML effettivamente impedite schede in modo esplicito.

+0

Credo che non sia corretto sui caratteri di tabulazione e ho notato che alcuni parser online fanno lo stesso errore. La [spec] (http://yaml-online-parser.appspot.com/) _does_ consente i caratteri della tabulazione: "Rientro esterno e contenuto scalare, YAML utilizza i caratteri dello spazio bianco per la separazione tra i token all'interno di una linea. può tranquillamente includere caratteri di tabulazione. " –

+0

Inoltre, la [specifica] (http://www.yaml.org/spec/1.2/spec.html#id2778481) consente le tabulazioni nelle posizioni dei prefissi di riga per le linee di flusso: "Per gli stili scalari di flusso include inoltre tutto lo spazio bianco iniziale , che può contenere caratteri di tabulazione. " Ciò renderebbe qualsiasi JSON compatibile con un parser YAML corretto, tranne nel caso in cui le specifiche JSON lo lasciano all'implementatore (come indicato dal commento su RFC4627). –

+2

@BrandonBonds è interessante. Nel migliore dei casi, sembrerebbe che la specifica YAML sia incoerente con se stessa. Non sono sicuro di come riconciliare dichiarazioni come "In generale, il rientro è definito come zero o più caratteri di spazio all'inizio di una linea" e "Per mantenere la portabilità, i caratteri di tabulazione non devono essere utilizzati in rientranza", con la verbosità hai fatto riferimento, nonostante appartenessero alla stessa specifica. – jmar777