[Library] Json
trigram17-May-2011/17:41:31+2:00
Bonjour,

Je suis en train de travailler sur la librairie JSON.

http://www.json.org/json.r

J'ai pris un exemple de la définition du JSON de Wikipedia :

http://en.wikipedia.org/wiki/JSON

La conversion de JSON vers REBOL fonctionne.
Par contre, la conversion de REBOL vers JSON me pose un problème et pourtant...

Voici mes 2 exemples de programmes :

%test-json-to-rebol.r
REBOL []
do %json.r
json-data: {{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021"
  },
  "phoneNumber": [
    {"type": "home", "number": "212 555-1234"},
    {"type": "fax", "number": "646 555-4567"}
  ]
}}     
res: json-to-rebol json-data
probe res
save %rebol-data.r res                


=> fonctionne sans problème et me génère un fichier %rebol-data.r

make object! [
    firstName: "John"
    lastName: "Smith"
    age: 25
    address: make object! [
        streetAddress: "21 2nd Street"
        city: "New York"
        state: "NY"
        postalCode: "10021"
    ]
    phoneNumber: [make object! [
            type: "home"
            number: "212 555-1234"
        ] make object! [
            type: "fax"
            number: "646 555-4567"
        ]]
]


%test-rebol-to-json.r
REBOL []
do %json.r
rebol-data: load/all %rebol-data.r                
res: rebol-to-json rebol-data
probe res


=> Ce dernier plante

>> do %test-rebol-to-json.r
Script: "Untitled" (none)
Script: "JSON to Rebol converter" (1-Feb-2010)
** Script Error: switch expected cases argument of type: block
** Where: reb-to-JSON-value
** Near: switch/default type?/word val [
    none! ["null"]
    logic! [pick ["true" "false"] val]
    integer! [form val]
   ...


Alors, ce qui est bizarre est que si à la suite du premier exemple, je fais la conversion à nouveau en JSON, cela marche...

REBOL []
do %json.r
json-data: {{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021"
  },
  "phoneNumber": [
    {"type": "home", "number": "212 555-1234"},
    {"type": "fax", "number": "646 555-4567"}
  ]
}}     
res: json-to-rebol json-data
probe res
save %rebol-data.r res
res2: rebol-to-json res
probe res2    


Je ne comprends pas pourquoi.

Nicolas
trigram17-May-2011/17:45:08+2:00
Et évidemment, mon but est de renseigner un objet REBOL à partir d'un fichier CSV et de constituer la structure à plusieurs niveau.

REBOL []
do %json.r
rebol-data: make object! [
    firstName: "John"
    lastName: "Smith"
    age: 25
    address: make object! [
        streetAddress: "21 2nd Street"
        city: "New York"
        state: "NY"
        postalCode: "10021"
    ]
    phoneNumber: [make object! [
            type: "home"
            number: "212 555-1234"
        ] make object! [
            type: "fax"
            number: "646 555-4567"
        ]]
]                
res: rebol-to-json rebol-data
probe res
shadwolf17-May-2011/23:11:05+2:00
jSon la fameuse librairie qui permet aux page AJAX d'echanger des données avec le serveur . Ca métonne que personne ne se soit interressé a un usage de json pour rebol site dynamique -- en meme temps n'est pas redondant ?

pour répondre a ta question
heu comment tu veux qu'on débugue ta fonction rebol-to-json si tu ne nous fourni pas le code... je sais j'en demande bcp.

Il faut aussi nous dire quelle version de rebol (vu le message d'erreur je dirait du rebol 2) au vu de ce que me dit le message d'erreur qui ne semble etre clair que pour moi mais c'est normal j'ai 10 g de sang par litre d'alcool je peux me tromper mais il me semble qu'on a pas tout le block switch dans l'erreur et on ne voit pas s'il y a un block default et si tout les les block case sont bien implémentés.

si ca peut t'aider voici un example qui fonctionne

de switch avec type?/word comme arugment de comparaison pour les cases

value: 10:30
    print switch type?/word value [
        integer! [value + 10]
        decimal! [to-integer value]
        time! [value/hour]
        date! [first value/time]
    ]


En tout cas bravo belle initiative de portage.
shadwolf17-May-2011/23:14:42+2:00
la fonction qu'il nous manque c'est reb-to-JSON-value
sans elle on peut pas te dire pkoi le switch qu'elle contient plante.

Le message d'erreur semble indiquer qu'un des case n'est pas correctement fermé ... maquerait un ] a la suite d'un des cases
shadwolf17-May-2011/23:17:02+2:00
tiens en parlant de ] oublié ca me rappel qu'une des chose que j'aime bien dans eclipse c'est justement l'ajout automatique des accolades braquets parenthèse de fermeture.
C'etait une des choses que je voulais mettre dans viva rebol

tu tappe [ et le programme ajoute tout seul quelque ligne plus bas ] sans changer la position de ton curseur...
shadwolf17-May-2011/23:18:03+2:00
Et evidement [ et ] sont suffisement visibles pour pas être loupé.
trigram17-May-2011/23:23:22+2:00
@shadwolf

Excuse, j'aurai du écrire :

do http://www.json.org/json.r


au lieu de :

do %json.r


D'un autre côté mon topic commence par...

Bonjour,

Je suis en train de travailler sur la librairie JSON.

http://www.json.org/json.r


Donc, ce n'est pas ma librairie mais la librairie officielle dispo sur json.org pour REBOL...
Sic, ca existe !

Evidemment, je suis avec REBOL2.
R3 n'a pas d'existence pour moi actuellement.
Pas de polémique.

Donc là, tu as tous les éléments shad
Laurent17-May-2011/23:24:59+2:00
Je compte bien utiliser Json dans mes pages et j'avais trouvé la librairie suivante sur le site de Christopher Ross-Gill:
http://www.ross-gill.com/page/JSON_and_REBOL
shadwolf18-May-2011/0:03:54+2:00
 reb-to-JSON-value: func [val /local tmp] [
        switch/default type?/word val [
            none!    ["null"]
            logic!   [pick ["true" "false"] val]
            integer! [form val]
            decimal! [form val]
            ;string!  [add-quotes json-escaped-str copy val]
            object!  [reb-to-json-object val]
            word!    [reb-to-JSON-value get val]
        ] [
            either any-block? val [reb-to-json-block val] [
                add-quotes either any-string? val [
                    json-escaped-str copy val
                ] [form val]
            ]
        ]
    ]


donc voila la fonction issue du fichier json.r du site officiel json.org on constate que string! est commenté si tes données sont des string! c'est normal que ca passe pas.
shadwolf18-May-2011/0:07:14+2:00
Une idée recopie en local le script json.r et insert dans
la function reb-to-JSON-value >> probe type?/word val juste avant le switch histoire de voir pourquoi ca deconne.
shadwolf18-May-2011/0:22:27+2:00
ajoute un probe val aussi ...
je constate que le défault normalement se charge des type block! ou sting! ou autre qui n'ai pas été traité dans la liste des case comme le type struct! ou money! dans ses cas la il y aura un from de fait sur la donnée.

Il serrait intéréssante de savoir sur quelle valeur et quelle type de valeur bute le switch. et pour ca des probe a l'entrée de la fonction reb-to-JSON-value avant le switch sur val et type?/word val serait très utile.
shadwolf18-May-2011/0:26:12+2:00
j'imagine que le message d'erreur a très peu avoir avec la raison réelle du probleme puisqu'en fait comme on peut le voir le switch de reb-to-JSON-value est bien formé et contient toutes les ] requise a moins qu'un probleme de connexion internet (perte de packets...) ne fasse que le fichier json.r ne soit pas entierement téléchargé et que l'exécution se face sur un code incomplet. Le fait de télécharger le fichier json.r sur ton disque dur et de le tester en local devrait corriger cela si c'est le cas (mais ca me semble très peu probable..)
shadwolf18-May-2011/0:29:21+2:00
en regardant la structure de ton fichier rebol-data.r une bizarerie attire mon attention ca :

]
    phoneNumber: [make object! [
            type: "home"
            number: "212 555-1234"
        ] make object! [
            type: "fax"
            number: "646 555-4567"
        ]]


je crois pas avoir vu de cas ou pouvaient etre traité deux objet a la suite normalement c'est un coupe identifiant <données> qui est traité par identifiant <données> <données>
shadwolf18-May-2011/0:33:39+2:00
donc je pense que le probleme vient de la fin de ton fichier rebol-data.r

phonenumber devrait etre comme ca pour que ca marche

PhoneNumber: [ home: make object! [ ...] Fax: make object! [...] ]
shadwolf18-May-2011/0:55:11+2:00
peut etre une correction simple serait de faire
en sort que les donnée a traité par json-to-rebol soient:
phoneNumber
: {
    {"home": "number": "212 555-1234"},
    {"fax": "number": "646 555-4567"}
  }


au lieu de :

phoneNumber
: [
    {"type": "home", "number": "212 555-1234"},
    {"type": "fax", "number": "646 555-4567"}
  ]
shadwolf18-May-2011/0:59:28+2:00
hum .... je pense que c'est le block! qu'il digère pas ...

essai
phoneNumber
: {
    {"type": "home", "number": "212 555-1234"},
    {"type": "fax", "number": "646 555-4567"}
  }


bon fais les probe on en aura le coeur net... si ca se trouve ca n'a rien avoir...
shadwolf18-May-2011/1:28:56+2:00
bon voici le traçage que j'obtient sur linux avec rebol/view 2.7.8 a partir des codes que tu m'as donner et en mettant juste les probes que je t'avais conseillé dans la fonciton reb-to-JSON-value.

la premier implémentation que tu a fournie celle avec rebol-data: load/all %rebol-data.r

plante direct sur le make rebol-data: contient [ make object! [ name: "Smith" etc... et en fait il craque sur l'espace qu'il rencontre apres le make.

quand on prend ta deuxieme implementation celle ou du donne en dur le make objec! contenu dans %rebol-data.r la ca passe bien jusqu'au block! qui est attribuer a phoneNumber et pour exactement la meme raison make il le voit comme un word! puis il explose sur l'espace...

moralité de l'histoire pas d'objet dans un bloc ...
load/all nous fout l'objet dans un bloc donc il faut le sortir du block! pour que ca marche il me semble qu'on sortait les choses d'un block avec reduce...
je vais testé.
shadwolf18-May-2011/1:57:59+2:00
donc non c'est pas reduce pour sortir débloquifier des données qui devrait pas etre dans un bloc pour commencer...

je parle du block! qui est créé par load/all

enfin sauf pour phoneNumber c'est logique que les objets soient dans un block! car c'est ce qu'on demande.

Je me rappel plus du tout comment on débloquifie quelque chose ca fait aussi parti des fondementaux de rebol qu'on oubli juste apres s'en être servi... et c'est chiant...

Doit y avoir au moins 15 post sur ce forum comment on débloquifie un truc et il me semble qu'a chaque fois DideC repondait
shadwolf18-May-2011/2:16:40+2:00
hum si tu mets un nom de variable au debut du fichier rebol-data.r le reduce load/all %rebol-data.r fonctionnera!

Reduce va charger la variable et l'objet contenus dans le fichier rebol-data.r dans le contexte global et la fonction reb-to-JSON arrivera a travailler avec.

parconte pour la liste d'objet contenue dans phoneNumber la pas le choix le mieux c'est de changer la structure pour que ce soit comme l'objet adresse le type = l'identifiant de l'objet ( je dirais bien l'instance de l'objet mais on est pas dans un vrai language objet donc le mieux c'est de dire le pointeur ou l'identifiant)

phoneNumer: make object! [
home: make object! [ number: "555-1234"]
fax: make object! [ number: "555-3212"]
]
none18-May-2011/3:21:38+2:00
apres quelques heures de recherche ... pour débloquifie les données venant de load/all voici comment faire:

rebol-data: do load/all %rebol-data.r


a ce moment la rebol-data: make object! [ etc...]
et ne contient plus rebol-data: [make object! [ etc...]]
shadwolf18-May-2011/3:24:08+2:00
none = moi hein ... donc do load/all pour pas avoir les données chargées depuis un fichier dans un block! a graver sur une tablette en marbre qu'on va mettre sur le wiki...

voila do load/all c'est le genre de truc qu'on utiliser 10000 fois et qu'on fini par completement oublier tellement c'est anodin.
shadwolf18-May-2011/3:44:15+2:00
pour finir voici la stucture de donnée qui fonctionne


REBOL []

; test json to rebol

do %json.r

json-data: {{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021"
  },
  "phoneNumber": {
    "home": "212 555-1234",
    "fax": "646 555-4567"
  }
}}  
   
res: json-to-rebol json-data
probe res
save %rebol-data.r res
res2: rebol-to-json res
probe res2    


produit: le fichier rebol-data.r qui contient:
make object! [
    firstName: "John"
    lastName: "Smith"
    age: 25
    address: make object! [
        streetAddress: "21 2nd Street"
        city: "New York"
        state: "NY"
        postalCode: "10021"
    ]
    phoneNumber: make object! [
        home: "212 555-1234"
        fax: "646 555-4567"
    ]
]



et le contraire rebol to json
o %json.r
rebol-data: do load/all %rebol-data.r    

comment {
rebol-data: make object! [
    firstName: "John"
    lastName: "Smith"
    age: 25
    address: make object! [
        streetAddress: "21 2nd Street"
        city: "New York"
        state: "NY"
        postalCode: "10021"
    ]
    phoneNumber: [make object! [
            type: "home"
            number: "212 555-1234"
        ] make object! [
            type: "fax"
            number: "646 555-4567"
        ]]
]
}            
res: rebol-to-json rebol-data
probe res


produit :

debug:
make object! [
    firstName: "John"
    lastName: "Smith"
    age: 25
    address: make object! [
        streetAddress: "21 2nd Street"
        city: "New York"
        state: "NY"
        postalCode: "10021"
    ]
    phoneNumber: make object! [
        home: "212 555-1234"
        fax: "646 555-4567"
    ]
]
object!
End debug
debug:
John
string!
End debug
debug:
Smith
string!
End debug
debug:
25
integer!
End debug
debug:
make object! [
    streetAddress: "21 2nd Street"
    city: "New York"
    state: "NY"
    postalCode: "10021"
]
object!
End debug
debug:
21 2nd Street
string!
End debug
debug:
New York
string!
End debug
debug:
NY
string!
End debug
debug:
10021
string!
End debug
debug:
make object! [
    home: "212 555-1234"
    fax: "646 555-4567"
]
object!
End debug
debug:
212 555-1234
string!
End debug
debug:
646 555-4567
string!
End debug
{{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021"
    },
    "phoneNumber": {"home": "212 555-1234", "fax": "646 555-4567"}
}}
shadwolf18-May-2011/3:55:16+2:00
voila un example complet de traçage /debug complet d'un script rebol.

Ce que nous a permis les probe au debut de reb-to-JSON-value:

1) comprendre qu'une définition d'objet! dans un block! n'est pas compris par l'analyseur de donnée rebol reb-to-JSON-value

2) ca nous a permis de nous rendre compte que load/all nous mettait la définition de notre object! principal dans un block!

3) on a appris que pour débloquifier des données chargée par load/all il fallait y ajouter a droite do toto: do load/all fichier-données.r

4) on a appris que la structure de phoneNumber était problématique puisqu'encore c'était des définition d'object! dans un block!

5) On a trouvé plus "simple" de changer la structure de phoneNumber pour s'adapter à ce qu'arrive a faire l'analyste de données rebol reb-to-JSON-value. Plutot que d'essayer de modifier le mode de fonctionnement de reb-to-JSON-value.

6) enfin on a découvert que les block! contenant des definition d'object! sans identifiant précédent ce n'etait pas gérable en rebol
shadwolf18-May-2011/4:02:46+2:00
pour le 6) on peut toujours se creuser la tête pour arriver a utiliser un block! contenant des définition d'object!

un truc du genre
foearch [word type def-obj] list-object [
reduce [ a: make object! def-obj ]
;traitement de a pour le transformé en string JSON
]

mais bon c'est pas top... faisons simple... on a réussi a toruver une solution qui a du sens a tout nos problemes. Réjouissons nous !!!
DocKimbel18-May-2011/10:10:12+2:00
@trigram

L'erreur est causée par une sérialisation partielle des objets lors de la sauvegarde dans %test-json-to-rebol.r[/]. Si tu utilises SAVE/ALL, ton code fonctionnera sans problème:
save/all %rebol-data.r res
trigram18-May-2011/13:53:39+2:00
@DocKimbel

Tu es les plus fort !
shadwolf18-May-2011/18:40:17+2:00
sauf qu'en passant de rebol a json on obtient pas la structure json adecouate qu'on a donné au départ. avec la solution apportée par docKimble

donnée JSON de départ
 {{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021"
  },
  "phoneNumber": [
    {"type": "home", "number": "212 555-1234"},
    {"type": "fax", "number": "646 555-4567"}
  ]
}}     


données JSON reconvertie par rebol-to-json
{[
    {
        "firstName": "John",
        "lastName": "Smith",
        "age": 25,
        "address": {
            "streetAddress": "21 2nd Street",
            "city": "New York",
            "state": "NY",
            "postalCode": "10021"
        },
        "phoneNumber": [
            {"type": "home", "number": "212 555-1234"},
            {"type": "fax", "number": "646 555-4567"}
        ]
    }
]}


la dégradation de la stucture des données est au niveau de {{ et }} en debut et fin de structure qui ont été remplacer par {[ et ]}

Ma méthode ne dégradant pas la structure des données elle est la meilleure.

Ceci dit je ne m'attend pas a être remercié pour le travail effectué n'etant pas un Guru primé.
shadwolf18-May-2011/18:42:08+2:00
5 heures de boulot et ce qu'on remerci c'est une solution qui n'en ai pas une... ennorme et apprès on va se demander pkoi je me suis barré de la communauté rebol
shadwolf18-May-2011/18:47:50+2:00
save/all et load/all vont de paire c'est certain mais le moteur rebol-to-json a quand meme un problème puisque bien que permettant de fonctionner sans plantage on a une dégradation de la structure des données. Ce qui pourait faire planter un autre programme ou générer des incohérences
shadwolf18-May-2011/18:58:41+2:00
ce qui est rigolo c'est que si on réinject ce segment de données dont la structure a été altérée dans un processus de conversion reconversion a la deuxieme passe on obtient un [ suplémentaire et ainsi de suite ....

[/code]
{[
[
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber": [
{"type": "home", "number": "212 555-1234"},
{"type": "fax", "number": "646 555-4567"}
]
}
]
]}
[/code]
DocKimbel18-May-2011/18:58:59+2:00
@trigram: pour éviter le problème au chargement évoqué par shadwolf, tu dois utiliser LOAD au lieu de LOAD/ALL (les objets sérialisés ne nécessitent pas l'usage du /ALL à la relecture):
rebol-data: load %rebol-data.r


Personnellement, j'utilise l'excellent AltJSON (déjà mentionné par Laurent plus haut, je re-poste l'URL: http://www.ross-gill.com/r/altjson.html)
trigram18-May-2011/19:01:28+2:00
@shadwolf

Je n'ai pas eu le temps de creuser ta partie, il faut que je passe 5h x 3 (car je suis pas doué) pour tout comprendre et analyser...
shadwolf18-May-2011/19:06:53+2:00
altJSON je sais pas si c'est mieux que json je sais en tout cas que l'auteur à l'air de travailler régulièrement sur le sujet.

dockImbel donc save et load tout court ?

mais ca on a deja essayé et voici ce que ca donne
block!
End debug
debug:
make
word!
End debug
debug:
End debug
** Script Error: switch expected cases argument of type: block
** Where: reb-to-JSON-value
** Near: probe val 
probe type?/word val


l'analyste arrive a pas comprendre [make object! et plante directe.
shadwolf18-May-2011/19:10:47+2:00
parcontre save/all dans le processus json to rebol puis load dans la conversion rebol to json fonctionne parfaitement.
Cette fois ci on a pas cette ajout de ] incrémental entre les }} comme on l'avait avec save/all | load/all.
shadwolf18-May-2011/19:16:05+2:00
Ceci dit il serrait logique que la "librairie" d'interface JSON - rebol propose d'enregistrer automatiquement tes données et des les charger automatiquement...

avec l'ajout d'un raffinement /OUTPUT-FILE a la fonction json-to-rebol et /INPUT-FILE a la fonction rebol-to-json

ca eviterait ce genre de problème et de jouer avec save et load ou d'essayer de trouver un moyen pour que ca marche quand meme meme si on a pas fait ce qu'il fallait...
shadwolf18-May-2011/19:26:07+2:00
bref comme on l'a vu a un rafinement près ou pas un analyste marche parfaitement, dégrade la structure de donnée ou plante carément.

Je trouve pour ma part que ce que j'ai fait n'est pas inutile car il permet de voir ce que les différent positionnement de /all permet d'obtenir comme donnée.

ce que j'avais proposé save | do load avec un jeu de donnée un peu modifié
shadwolf18-May-2011/19:27:22+2:00
n'est pas invalide en soit et découle d'un processus d'étude du comportement du script en fonction des données passée.
shadwolf18-May-2011/19:29:34+2:00
et c'est pas la pauvre documentation qui nous permet de savoir quand mettre ou pas /all a save et load.
trigram18-May-2011/22:11:30+2:00
@DocKimbel

Impect !

Pour la librairie de Chris...

Le résultat pour notre exemple commence plutôt bien, mais après...

{"firstName":"John","lastName":"Smith","age":25,"address":{"streetAddress":"21 2nd Street","city":"New York","state":"NY","postalCode":"10021"},"phoneNumber":["make","object!",["set-word!","home","set-word!","212 555-1234"],"make","object!",["set-word!","fax","set-word!","646 555-4567"]]}


@shadwolf

Ce qu'indique DocKimbel fonctionne.
Par contre, faire un rebol-data: make object! ... ne fonctionne toujours pas.
Si par contre, je fait un rebol-data: #[object! [firstName... (contenu de rebol-data.r), là cela fonctionne.
Mais à un moment autant générer directement du JSON depuis le fichier CSV...
shadwolf19-May-2011/1:48:07+2:00
@ trigram

tu as pas du tout lire

si tu fais un save dans test-json.r et un rebol-data: do load %rebol-data.r
and ayant changer la structure de phoneNumber ca fonctionne très bien.

Evidement avec la solution save/all puis load de dockImbel ca marche encore mieux. Ceci dit moi j'ai essayé de montrer aussi comment on trace une programme qui plante ce qui peut toujours etre interressant.
shadwolf19-May-2011/1:49:15+2:00
c'est do load/all ... désolé pour cette imprécision

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2