Italiano

Strumenti per sviluppatori · Convertitori di sintassi

Funzionalità YAML perse in una conversione JSON: commenti, ancoraggi e tag

· Come funziona

yaml json formati di dati

YAML commenti e ancoraggi svaniscono mentre i dati risolti continuano in JSON
Illustrazione vettoriale originale ToolAcre

YAML ha commenti, ancore, alias, chiavi di unione, tag e flussi multi-documento; JSON non ne ha nessuno. Questo post spiega cosa fa un convertitore con ciascuno di essi e perché la riconversione non ripristina mai il file originale.

Il file è tornato più a lungo e senza un singolo commento: una configurazione YAML convertita in JSON e viceversa, e tutto ciò che non è sopravvissuto

Un file YAML può tornare da JSON più a lungo anche dopo la scomparsa di ogni commento. Gli ancoraggi che condividono una mappatura vengono risolti in dati oggetto ripetuti, quindi il serializzatore scrive ciascuna copia in modo indipendente. I valori possono ancora concordare, ma la struttura autoriale e la spiegazione sono scomparse.

Questo è il motivo per cui un viaggio di andata e ritorno da YAML-a-JSON-a-YAML dovrebbe essere considerato una conversione dei dati, non una conservazione della fonte. ToolAcre legge un grafico di valori limitati e scrive un nuovo documento. Non mantiene mai un albero sintattico concreto contenente commenti, nomi di ancoraggi, scelte di virgolette o presentazione scalare a blocchi.

Commenti: perché JSON non ha posto per loro e ogni # riga scompare dopo la conversione

I commenti vengono scartati dal parser YAML perché JSON non ha un nodo commenti. Una riga che inizia con `#` può spiegare perché esiste un timeout o chi possiede un servizio; una volta rimosso, nessun algoritmo può dedurne la formulazione o il posizionamento. La conversione indietro crea YAML valido senza quel contesto operativo.

Conserva il file originale nel controllo della versione e rivedi le differenze prima di sostituirlo. Se l'obiettivo è solo controllare i valori risolti, JSON è utile. Se l'obiettivo è riformattare mantenendo il commento, questo convertitore di valori generici è la rappresentazione sbagliata.

Ancore e alias: &default e *default espansi in copie ripetute e come il file cresce di conseguenza

Ancore e alias vengono accettati entro i limiti di sicurezza, quindi risolti. `base: &b {x: 1}` e `copy: *b` diventano due percorsi di oggetti contenenti `x: 1`. L'output YAML utilizza `noRefs`, quindi l'identità dell'oggetto condiviso non crea nuovi ancoraggi. Il rapporto compatto scompare anche quando sopravvivono i valori ripetuti.

Gli alias ricorsivi vengono rifiutati perché JSON non può esprimere cicli. L'espansione degli alias è limitata dal conteggio degli alias, dalla nidificazione e dalla misurazione del nodo espanso; viene fermato un breve documento che si stringerebbe in più di un milione di valori. Questo protegge la scheda senza richiedere un supporto YAML arbitrario.

Chiavi di unione: la convenzione <<: da YAML 1.1, in che modo i parser che la supportano appiattiscono la mappatura unita e cosa succede in quelli che non lo fanno

La struttura presuppone che le chiavi di unione YAML 1.1 siano appiattite. ToolAcre carica solo JSON o lo schema Core di js-yaml, nessuno dei quali abilita il tipo di unione. In questi schemi, una chiave `<<` è costituita da dati ordinari anziché da un'istruzione per unire le mappature. Presentare un'unione appiattita come comportamento spedito sarebbe pertanto falso.

Se l'origine dipende dalla semantica della chiave di unione, risolvila nell'applicazione che possiede tale convenzione o riscrivi i valori in modo esplicito prima della conversione. Un alias utilizzato come valore ordinario `<<` può comunque risolversi in un oggetto, ma la chiave rimane `<<`; ciò non equivale a unire i suoi membri nel genitore.

Le chiavi di unione non sono abilitate dai due schemi limitati forniti da questo convertitore

I tag espliciti standard riconosciuti dallo schema limitato possono scegliere i tipi di base, come `!!str` o `!!int`. I tag personalizzati e più ricchi, inclusi binari, timestamp, set, mappa ordinata, funzione JavaScript e costruttori di oggetti Python, vengono rifiutati. Non sono stringificati e non vengono mai eseguiti.

È accettato un flusso YAML separato da `---`. Un documento diventa un valore; diversi diventano un array con un avviso che nomina il conteggio dei documenti. Un separatore finale può creare un documento finale vuoto secondo lo schema selezionato. Nessun target qui ha un modello di flusso, quindi l'array è una convenzione dichiarata.

I tag non sicuri vengono rifiutati; i flussi multi-documento diventano array

Utilizza `defaults: &d` con tentativi e timeout, un commento che spiega il timeout, quindi `service:` con `inherited: *d`. JSON contiene sia i valori predefiniti che un oggetto ereditato ripetuto; il commento e il nome dell'ancora sono assenti. La conversione di JSON indietro produce due mappature anziché una relazione di ancoraggio.

Aggiungi `---` seguito da un altro documento e la radice JSON diventa un array di documenti. Aggiungi `!!binary` e la conversione si interrompe con un suggerimento sullo schema limitato. Queste tre modifiche distinguono i dati supportati risolti, la convenzione strutturale e la costruzione completamente non supportata.

Ciò che questo non copre è l'ordine delle chiavi e lo stile delle virgolette, che di solito sopravvivono ma non sono garantiti da nessuno dei due formati

L'ordine ordinario di inserimento degli oggetti spesso rimane visibile, ma non è la conservazione dello stile di origine e la selezione delle chiavi di ordinamento lo modifica deliberatamente. Le virgolette, il flusso rispetto allo stile a blocchi, l'ortografia scalare e i commenti non sopravvivono. Le chiavi di mappatura duplicate mantengono l'ultimo valore con un avviso anziché preservare entrambe le voci non valide.

Lo scrittore protegge le stringhe ambigue citando valori che un consumatore YAML 1.1 potrebbe leggere erroneamente, ma tale scelta di sicurezza può differire dallo stile originale dell'autore. L'uguaglianza dei dati è il test difendibile per i valori ordinari a forma di JSON; l'uguaglianza testuale non lo è.

L'ordine delle chiavi può rimanere, mentre i commenti, gli ancoraggi, l'ortografia dei tag e lo stile non vengono conservati

YAML-to-JSON è con perdita ogni volta che il significato vive al di fuori del valore a forma di JSON: commenti, alias, tag non supportati, limiti del flusso in quanto tali e stile. ToolAcre rende visibili diverse perdite e rifiuta costrutti pericolosi o ciclici invece di pretendere di preservarle.

Converti un file rappresentativo prima di adottare il flusso di lavoro. Esamina gli avvisi, i valori risolti dalle differenze e mantieni il file YAML creato. Il pannello è una lente eccellente su ciò che vede un parser, ma non è un editor che preserva i commenti o un trasformatore completo di modelli di oggetti YAML.

Per una revisione della migrazione, separa le modifiche ai valori dalle modifiche solo all'origine. Un confronto approfondito JSON può stabilire se i valori ordinari sono sopravvissuti, mentre un confronto testuale rivela commenti, ancoraggi e stile che necessariamente sono cambiati. Nessuno dei due assegni sostituisce l'altro. Chiamare il confronto dei valori senza perdite ignorerebbe le informazioni sulla fonte; chiamare ogni modifica testuale un errore di dati ignorerebbe la riserializzazione valida.