mochijson2 o mochijson
Domanda
Sono codifica alcuni dati utilizzando mochijson2. Ma ho scoperto che si comporta strano sulle stringhe come liste.
Esempio:
mochijson2:. Encode ( "foo")
[91, "102", 44 "111", 44 "111", 93]
Dove "102", "111", "111" sono $ f, $ o, $ o codificati come stringhe 44 sono virgole e 91 e 93 sono parentesi quadre.
Naturalmente se l'uscita Ho questo da qualche parte avrò stringa "[102.111.111]", che non è ovviamente che quello che quello.
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
Questa è la domanda - perché è così incoerente. Capisco che c'è un problema distingushing elenco erlang che dovrebbe essere codificato come matrice JSON e la stringa erlang che dovrebbe essere codificato come stringa JSON, ma almeno posso esso binaria di uscita quando lo 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? Unicode gestione? C'è altro?
Grazie
Soluzione
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 stringhe in Erlang sono infatti una lista di interi.
Di conseguenza il vostro "foo", o in altre parole, il vostro [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 iodata tipo. Iodata è fondamentalmente un elenco ricorsivo di stringhe, file binari e iodatas (in iolists fatto). Se si intende solo per inviare il risultato "attraverso il filo", è più efficiente proprio nido in una lista che li converte in una stringa piatta.