Domanda Dovrei usare YAML o JSON per memorizzare i miei dati Perl? [chiuso]


Sto usando il formato YAML con un ragionevole successo negli ultimi 6 mesi circa.

Tuttavia, l'implementazione pura di Perl del parser YAML è equa Fiducioso a mano-scrivere un file leggibile per e ha (secondo me) stranezze fastidiose come richiedere una nuova riga alla fine del file. È anche gigantamente lento rispetto al resto del mio programma.

Sto riflettendo sulla prossima evoluzione del mio progetto, e sto considerando usando invece JSON (un sottoinsieme per lo più severo di YAML, come si trasforma su). Ma quale formato ha la maggior parte della trazione e dell'impegno della community in Perl?

Quale appare oggi come il migliore formato a lungo termine per la semplicità descrizione dei dati in Perl, YAML o JSON e perché?


44
2017-12-09 20:40


origine


risposte:


YAML vs JSON è qualcosa che non si risolve in Perl, e ammetto che tendo a trovarmi nel mezzo. Vorrei consigliarvi che sia per ottenere la massima partecipazione della comunità. Prenderei la decisione in base ai vari pro e contro dei formati. Analizzo le varie opzioni di serializzazione dei dati in questo modo (vado al wiki della community così le persone possono aggiungerle):

YAML Pro

  • Umiltà, le persone scrivono YAML di base senza nemmeno saperlo
  • Corde WYSIWYG
  • Espressivo (ha la natura TMTOWDI)
  • Sistema espandibile di tipo / metadati
  • Tipi di dati compatibili Perl
  • Portatile
  • Familiar (molte delle sintassi inline e string hanno l'aspetto del codice Perl)
  • Buone implementazioni se hai un compilatore (YAML :: XS)
  • Buona capacità di scaricare dati Perl
  • Uso compatto dello spazio dello schermo (possibile, è possibile formattare per adattarsi in una riga)

YAML Cons

  • Grande spec
  • Implementazioni Perl pure inaffidabili / incomplete
  • Lo spazio bianco come sintassi può essere polemico.

JSON Pro

  • Umano leggibile / scrivibile
  • Piccole spec
  • Buone implementazioni
  • Portatile
  • Sintassi Perlish
  • YAML 1.2 è un superset di JSON
  • Uso compatto dello spazio dello schermo
  • Perl tipi di dati amichevoli
  • Un sacco di cose gestiscono JSON

JSON Cons

  • Le stringhe non sono WYSIWYG
  • Nessuna espandibilità
  • Alcune strutture Perl devono essere espresse ad-hoc (oggetti e globi)
  • Mancanza di espressività

XML Pros

  • Uso diffuso
  • Sintassi familiare agli sviluppatori web
  • Grande corpus di buoni moduli XML
  • schemi
  • Tecnologie per cercare e trasformare i dati
  • Portatile

XML Contro

  • Noioso per gli umani leggere e scrivere
  • Strutture dati estranee a Perl
  • Mancanza di espressività
  • Grande spec
  • verboso

Perl / Data :: Dumper Pros

  • Nessuna dipendenza
  • Sorprendentemente compatto (con le bandiere giuste)
  • Perl amichevole
  • Può scaricare praticamente qualsiasi cosa (via DDS)
  • Espressivo
  • Uso compatto dello spazio dello schermo
  • Corde WYSIWYG
  • familiare

Perl / Data :: Dumper Cont

  • Non portatile (in altre lingue)
  • Insicuro (senza misure eroiche)
  • Inscrutabile ai programmatori non Perl

Pro memorizzabili

  • Compatto? (non avere numeri per eseguirne il backup)
  • Veloce? (non avere numeri per eseguirne il backup)

Conservabile

  • Umano ostile
  • Incompatibile tra versioni Storable
  • Non portatile (in altre lingue)

79
2017-12-09 20:54



Come con la maggior parte delle cose, dipende. Penso che se vuoi la velocità e l'interoperabilità (con altre lingue), usa in particolare JSON JSON :: XS.

Se vuoi qualcosa che sarà usato solo dai moduli Perl, continua con YAML. È molto più comune trovare moduli Perl su CPAN che supportano la descrizione dei dati con YAML, o che dipendono da YAML, rispetto a JSON.

Nota che non sono un'autorità e questa opinione si basa in gran parte su intuizioni e congetture. In particolare, non ho profilato JSON :: XS vs. YAML :: XS. Se sono offensivamente ignorante, posso solo sperare di rendere qualcuno così irato da portare informazioni utili alla discussione correggendomi.


13
2017-12-19 11:49



È tutta una questione di leggibilità umana, se questa è la tua principale preoccupazione, scegli YAML:

YAML:

american:
  - Boston Red Sox
  - Detroit Tigers
  - New York Yankees
national:
  - New York Mets
  - Chicago Cubs
  - Atlanta Braves

JSON:

{
  "american": [
    "Boston Red Sox", 
    "Detroit Tigers", 
    "New York Yankees"
  ], 
  "national": [
    "New York Mets", 
    "Chicago Cubs", 
    "Atlanta Braves"
  ]
}

7
2017-12-10 14:46



L'implementazione YAML puro-Perl (YAML modulo in contrasto con YAML::Syck) sembra avere alcuni problemi seri. Recentemente mi sono imbattuto in problemi in cui non era possibile elaborare i documenti YAML con linee molto lunghe (32k caratteri o così).

YAML è in grado di memorizzare e caricare variabili benedette e lo fa tramite predefinito (il frammento di seguito è stato copiato da un *sepia-repl* buffer in Emacs):

I need user feedback!  Please send questions or comments to seano@cpan.org.
Sepia version 0.98.
Type ",h" for help, or ",q" to quit.
main @> use YAML
undef
main @> $foo = bless {}, 'asdf'
bless( {}, 'asdf' )
main @> $foo_dump = YAML::Dump $foo
'--- !!perl/hash:asdf {}
'
main @> YAML::Load $foo_dump
bless( {}, 'asdf' )

Questo è piuttosto spaventoso dal punto di vista della sicurezza perché è possibile utilizzare dati non attendibili chiamare qualsiasi DESTROY metodo che è stato definito nella tua applicazione - o uno dei moduli che utilizza.

Il seguente breve programma dimostra il problema:

#!/usr/bin/perl
use YAML;
use Data::Dumper;
package My::Namespace;
sub DESTROY {
    print Data::Dumper::Dumper \@_;
}
package main;
my $var = YAML::Load '--- !!perl/hash:My::Namespace
bar: 2
foo: 1
';

JSON non lo consente di default - è possibile serializzare Perl "oggetti", ma per fare ciò, devi definire TO_JSON metodi.


4
2017-12-10 02:56



se stai prendendo in considerazione la notazione oggetto JavaScript, perché non utilizzare "Notazione oggetto Perl"?

JSON:

{"name": "bob", "parents": {"mother": "susan", "father": "bill"}, "nums": [1, 2, 3]}

Perl:

{name => "bob", parents => {mother => "susan", father => "bill"}, nums => [1, 2, 3]}

1
2017-12-09 21:12



Si potrebbe anche voler considerare l'utilizzo riponibile. Probabilmente otterrai un buon incremento di velocità con esso. I trade-off sono:

  • il formato memorizzabile è binario e non leggibile come JSON o YAML
  • Memorizzabile non è un modulo Perl puro (se questo è importante)

0
2017-09-16 16:00



Io uso YAML per monitorare lo stato dei processi perché posso leggere YML nel mezzo del processo. Tu (tecnicamente) hai bisogno di documenti completamente formati per leggere XML o JS. YAML è bello per lo stato di tracciamento perché puoi scrivere molti mini doc in un file. Altrimenti, di solito vado con XML o JS. Bel riassunto di pro e contro sopra, btw.


0