2009-10-13 7 views
7

Sto codificando alcuni dati usando mochijson2. Ma ho scoperto che si comporta in modo strano sulle stringhe come liste.mochijson2 o mochijson

Esempio:

mochijson2: encode ("foo").

[91, "102", 44 "111", 44 "111", 93]

Dove "102", "111", "111" sono $ f, $ o, $ o encoded come stringhe 44 sono le virgole e 91 e 93 sono le parentesi quadre.

Ovviamente se faccio l'output da qualche parte otterrò la stringa "[102,111,111]" che ovviamente non è quello che io cosa.

Se provo

mochijson2: encode (< < "foo" >>).

[34, < < "foo" >>, 34]

Così ho di nuovo ho un elenco di due doublequotes e parte binaria all'interno dei quali può essere tradotto in binario con list_to_binary/1

Ecco la domanda: perché è così incoerente. Capisco che c'è un problema nella lista di distribuzione che dovrebbe essere codificata come array json e stringa erlang che dovrebbe essere codificata come stringa json, ma almeno può emettere binari quando la passo binario?

E la seconda domanda: Sembra mochijson Uscite tutto bello (causa usa tuple speciale per designare gli array di array {...})

mochijson: encode (< < "foo" >>).
"\" foo \ ""

Qual è la differenza tra mochijson2 e mochijson? Prestazione? Gestione Unicode? Qualunque altra cosa?

Grazie

risposta

7

La mia ipotesi è che la decisione in mochijson è che si tratta di un binario come una stringa, e si tratta di un elenco di numeri interi come una lista di numeri interi. (Un?) Fortunatamente le stringhe in Erlang sono in effetti una lista di interi.

Di conseguenza il tuo "foo", o in altre parole, il tuo [102,111,111] è tradotto in testo che rappresenta "[102,111,111]". Nel secondo caso il vostro < < "pippo" >> stringa diventa "pippo"

Per quanto riguarda la seconda domanda, mochijson sembra tornare sempre una stringa, mentre mochijson2 restituisce un tipo iodata. Iodata è fondamentalmente un elenco ricorsivo di stringhe, binari e iodati (in pratica iolisti). Se si intende inviare il risultato solo "via cavo", è più efficiente raggrupparli in una lista piuttosto che convertirli in una stringa piatta.

+0

Grazie per la risposta, ma ancora non tutto chiaro. Immagino: il secondo caso la tua stringa <<"foo">> diventa "pippo" non è vera, o [34, <<"foo">>, 34] è equivalente a "pippo"? E il supporto di utf-8 in mochijson? quando ho usato mochijson2 ho aggiunto l'opzione {utf8, true} al codificatore. –

+3

Prova a erlang: iolist_to_binary ([34, <<"foo">>, 34]). 34 è un singolo "carattere, <<"foo">> è la stringa lunga di tre caratteri foo (w/o"), e il 34 è un altro ". – Zed

+0

Indipendentemente dal fatto che la spiegazione di iodata è ancora un altro problema." Foo "non è valido JSON e non può essere tradotto in JSON valido. –