46 votes

Devrais-je utiliser YAML ou JSON pour stocker mes données Perl?

J'ai été en utilisant le format YAML avec un certain succès dans les 6 derniers mois ou ainsi.

Cependant, le pur Perl mise en œuvre de l'analyseur syntaxique YAML est assez agité de la main-d'écrire un fichier lisible et a (à mon avis) ennuyeux bizarreries telles que l'obligation d'un retour à la ligne à la fin du fichier. C'est aussi gigantically lent par rapport au reste de mon programme.

Je suis à réfléchir à la prochaine évolution de mon projet, et je suis en train d'étudier à l'aide de JSON à la place (surtout un sous-ensemble strict de YAML, il s' out). Mais le format qui a le plus de communauté de traction et de l'effort en Perl?

Qui semble aujourd'hui le mieux à long terme de format pour de simples la description des données en Perl, YAML ou JSON, et pourquoi?

81voto

Schwern Points 33677

YAML vs JSON est quelque chose de très bien qui ne sont pas réglés en Perl, et j'avoue que j'ai tendance à être dans le milieu de la. Je voudrais des conseils que ce soit, va vous recevoir à peu près autant de la communauté de traction. Je voudrais faire la décision en se basant sur les avantages et les inconvénients des formats. Je suis en panne les différentes données de la sérialisation des options comme si (je vais le wiki de la communauté ce afin que les gens peuvent ajouter):

YAML Pros

  • De l'homme, les gens d'écriture de base de DONNÉES, sans même le savoir
  • WYSIWYG chaînes
  • Expressif (il a la TMTOWDI la nature)
  • Extensible type/système de métadonnées
  • Perl types de données compatibles
  • Portable
  • Familier (un lot de la ligne et de la syntaxe de la chaîne ressemble à du code Perl)
  • Bonnes implémentations si vous avez un compilateur (YAML::XS)
  • Bonne capacité de vidage de données de Perl
  • Compact, utilisation de l'espace à l'écran (ce qui est possible, vous pouvez mettre en forme pour tenir dans une seule ligne)

YAML Cons

  • Grand spec
  • Pas fiable ou incomplète pur Perl implémentations
  • Les espaces que la syntaxe peut être litigieux.

JSON Pros

  • L'homme accessible en lecture/écriture
  • Petite spec
  • Bonnes implémentations
  • Portable
  • Perlish syntaxe
  • YAML 1.2 est un sur-ensemble de JSON
  • Compact, utilisation de l'espace à l'écran
  • Perl amicale des types de données
  • Beaucoup de choses à gérer JSON

JSON Cons

  • Les chaînes ne sont pas WYSIWYG
  • Aucune évolutivité
  • Certains Perl structures doivent être exprimées ad-hoc (objets et des boules)
  • Manque de expressibility

XML Pros

  • L'utilisation généralisée
  • La syntaxe familière aux développeurs de sites web
  • Grand corpus de bonne XML modules
  • Les schémas
  • Les Technologies de recherche et de transformer les données
  • Portable

XML Cons

  • Fastidieux pour les humains à lire et à écrire
  • Structures de données étrangères à Perl
  • Manque de expressibility
  • Grand spec
  • Verbose

Perl/Data::Dumper Pros

  • Pas de dépendances
  • Étonnamment compact (avec le droit de drapeaux)
  • Perl amical
  • Peut dump à peu près tout (via DDS)
  • Expressif
  • Compact, utilisation de l'espace à l'écran
  • WYSIWYG chaînes
  • Familier

Perl/Data::Dumper Cons

  • Non portable (pour les autres langues)
  • Précaire (sans mesures héroïques)
  • Impénétrable à des non-programmeurs Perl

Stockable Pour Les Pros

  • Compact? (n'ont pas de numéros à l'appui)
  • Rapide? (n'ont pas de numéros à l'appui)

Stockables Cons

  • L'homme hostile
  • Incompatible travers Stockables versions
  • Non portable (pour les autres langues)

13voto

Adam Bellaire Points 42797

Comme avec la plupart des choses, ça dépend. Je pense que si vous voulez de la vitesse et de l'interopérabilité (avec d'autres langues), l'utilisation de JSON, en particulier JSON::XS.

Si vous voulez quelque chose qui ne va jamais être utilisé par des modules Perl, bâton avec YAML. C'est beaucoup plus courant de trouver Perl modules sur CPAN qui prennent en charge la description des données avec YAML, ou qui dépendent de YAML, que JSON.

Notez que je ne suis pas une autorité, et cette opinion est largement basé sur l'intuition et de la conjecture. En particulier, je n'ai pas profilé JSON::XS vs YAML::XS. Si je suis offensivement ignorants, je ne peux qu'espérer que je vais faire à quelqu'un en colère assez pour apporter de l'information utile à la discussion par la correction de moi.

9voto

PHPst Points 2929

Tout est une question de lisibilité humaine, si ceci est votre principale préoccupation, choisissez 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"
  ]
}
 

4voto

hillu Points 4033

Le pure-Perl YAML mise en œuvre (YAML module contrairement à YAML::Syck) semble avoir de sérieux problèmes. J'ai récemment rencontré des problèmes où il n'a pas pu traiter YAML documents avec des lignes très longues (32k caractères ou moins).

YAML est capable de stocker et de charger le bienheureux variables et le fait en par défaut (L'extrait ci-dessous a été copié à partir d'un *sepia-repl* de la mémoire tampon dans 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' )

C'est assez effrayant de vue de la sécurité, car les données non fiables peuvent être utilisés pour appeler n'importe quel DESTROY méthode qui a été définie dans votre application - ou l'un des modules qu'il utilise.

Le court programme illustre le problème:

#!/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 ne le permet pas par défaut -- il est possible de sérialiser Perl "objets", mais pour ce faire, vous devez définir TO_JSON des méthodes.

1voto

Eric Strom Points 30894

si vous envisagez une notation d'objets JavaScript, pourquoi ne pas utiliser la "notation d'objets 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]}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X