2010-08-17 6 views
2

En consommant une API ruby ​​json, je veux économiser du temps et générer des objets rubis dès le départ. Tout moyen de le faire?Générer des classes ruby ​​à partir du document json

pour que vous puissiez transformer ceci:

{"menu": { 
    "id": "file", 
    "value": "File", 
    "popup": { 
    "menuitem": [ 
     {"value": "New", "onclick": "CreateNewDoc()"}, 
     {"value": "Open", "onclick": "OpenDoc()"}, 
     {"value": "Close", "onclick": "CloseDoc()"} 
    ] 
    } 
}} 

à ceci:

class Menu 
    attr_accessor :id 
    attr_accessor :file 
    attr_accessor :popup 
end 
+1

Plus de détails. Qu'est-ce que tu veux? Voulez-vous que JSON '{foo:" bar "}' devienne un objet Ruby avec 'obj.foo # =>" bar "'? – jtbandes

+0

comme ceci http://github.com/movitto/RXSD mais pour json –

Répondre

2

Il y a une merveille pour ce faire.https://github.com/apotonick/representable/

Voici ce que votre représentable ressemblerait

module MenuRepresenter 
    include Representable::JSON 

    property :id 
    property :value 
    property :popup 
end 

Créez votre modèle

class Menu 
    attr_accessor :id, :value, :popup 
end 

menu = Menu.new.extend(MenuRepresenter).from_json(json) 

# You can convert it back into json via .to_json 
# expect(menu.to_json).to eq(json) 

L'exemple ci-dessus montre que la mise en œuvre de base, vous voulez créer une autre classe pour l'élément de menu, jetez un oeil à la documentation sur le repo de github pour des informations plus détaillées.

3

Si vous cherchez à transformer une chaîne JSON en Ruby Hash vous pouvez faire

my_hash = JSON.parse('{"foo":"bar"}') 
puts my_hash['foo'] 
+0

Je crois qu'il essaye de générer une classe à partir du JSON par opposition à la parer? – Steve

+0

Je pense que vous avez raison. J'ai lu "objet" dans la question avant que le lien vers RXSD a été posté. Donc je n'ai pas très bien compris ce qu'il cherchait. – aNoble

1

Si vous voulez des hachages "méthodiques" qui utilisent des méthodes d'accès (pas une mauvaise idée du tout!)

require "ostruct" 

object_like_hash = OpenStruct.new(some_hash_with_string_or_symbol_keys) 
object_like_hash.foo #=> same as some_hash["foo"] 

Les clés inexistantes retourneront nulles et ne déclencheront malheureusement pas.

+0

ne fonctionne pas pour les objets imbriqués. –

+0

Vous pouvez écrire un wrapper récursif qui fonctionne assez facilement ;-) – Julik

0

Je pense que vous êtes un peu confus. Dans la question, vous demandez comment transformer un document JSON en classes. Dans les commentaires, vous dites que vous voulez une version JSON de l'outil XML RXSD, qui transforme cependant les schémas schémas en classes Ruby.

Transformer les documents JSON en classes n'a pas vraiment de sens. Si vous comparez le monde du balisage de document à la programmation, les documents correspondent aux objets et les schémas correspondent aux classes (bien, les types, en fait, mais puisque nous parlons de Ruby, n'ouvrons pas cette boîte de Pandore). Il est donc logique de générer des objets Ruby à partir de documents JSON et il est logique de générer des classes Ruby à partir de schémas JSON, mais cela n'a pas de sens de générer des classes Ruby à partir de documents JSON. La mauvaise nouvelle est bien entendu que pour pouvoir générer automatiquement des classes Ruby à partir du schéma JSON, il faut que le schéma JSON soit dans un format pouvant être traité automatiquement (lisible par machine IOW).

Malheureusement, il n'y a pas une telle chose comme un schéma JSON, et donc les schémas JSON ont tendance à généralement pas lisibles par une machine, mais sont juste un texte de présentation du texte anglais orienté vers l'homme sur la page de documentation de l'API du fournisseur de services Web. Si tu es chanceux. Plus souvent qu'autrement, il n'y a aucune documentation à propos du schéma JSON. Donc, comme il n'y a pas de manière standardisée de décrire les schémas JSON, il ne peut pas y avoir d'outil standardisé pour le traitement des schémas JSON.

Contrairement à XML, où il existe un nombre limité de schémas standardisés (DTD, XSD, RelaxNG).

Notez que ce que je l'ai écrit ci-dessus ne sont pas tout à fait vrai: il sont spécifications pour les schémas de JSON (par exemple JSON-Schema) et il y a des implémentations Ruby de ceux (par exemple Ruby/JSONSchema, validation uniquement, ne génère pas de cours), mais personne ne les utilise, alors ils pourraient tout aussi bien ne pas exister.

+0

Il n'est pas nécessaire d'être un schéma pour générer du code ... –

+0

Heroku et Google ont adopté le schéma JSON –

Questions connexes