2009-10-13 16 views
7

Kodowanie niektórych danych za pomocą mochijson2. Ale odkryłem, że zachowuje się dziwnie w łańcuchach jako listach.mochijson2 lub mochijson

przykład:

mochijson2: kodowanie ("foo").

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

gdzie "102", "111", "111" są $ F $ O $ o zakodowane jako struny 44 są przecinkami, a 91 i 93 są kwadratowymi układami hamulcowymi.

Oczywiście, jeśli gdzieś to wyprowadzę, otrzymam ciąg "[102,111,11]", co oczywiście nie jest tym, co ja.

jeśli staram

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

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

Więc znowu ja dostać listę dwóch doublequotes i części binarnym, w którym mogą być tłumaczone na binarny z list_to_binary/1

Oto pytanie - dlaczego jest tak niekonsekwentne. Rozumiem, że istnieje problem z odróżnianiem listy erlang, która powinna być zakodowana jako tablica json i ciąg erlanga, który powinien być zakodowany jako łańcuch json, ale przynajmniej może wyprowadzić plik binarny po przekazaniu go binarnie?

I drugie pytanie: Wygląda mochijson wyprowadza wszystko Nicea (bo to wykorzystuje specjalne krotki do wyznaczenia macierzy {tablica, ...})

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

Jaka jest różnica między mochijson2 i mochijson? Wydajność? Obsługa Unicode? Coś jeszcze?

Dzięki

Odpowiedz

7

Domyślam się, że decyzja w mochijson jest to, że traktuje się jako ciąg binarny, i traktuje listę liczb całkowitych w postaci listy liczb całkowitych. (Un?) Na szczęście ciągi w Erlang są w rzeczywistości listą liczb całkowitych.

W rezultacie twoje "foo", czyli innymi słowy, twoje [102, 111, 111] jest tłumaczone na tekst oznaczający "[102,111,111]". W drugim przypadku, gdy < < „foo” >> ciąg staje się „foo”

Jeśli chodzi o drugie pytanie, mochijson wydaje się zawsze zwraca ciąg, natomiast mochijson2 zwraca typ iodata. Iodata jest po prostu rekursywną listą łańcuchów, binariów i iodatas (w rzeczywistości iolistów). Jeśli chcesz tylko wysłać wynik "przez przewód", lepiej jest po prostu zagnieździć je na liście niż przekonwertować na płaski ciąg.

+0

Dzięki za odpowiedź, ale nadal nie wszystko jasne. Zgaduję: drugi przypadek, w którym twój ciąg znaków staje się "foo", nie jest prawdziwy, lub [34, <<"foo">>, 34] jest równoważny "foo"? co z obsługą utf-8 w mochijson? kiedy użyłem mochijson2 i dodałem opcję {utf8, true} do kodera. –

+3

Wypróbuj erlang: iolist_to_binary ([34, <<"foo">>, 34]). 34 jest pojedynczą "postacią, <<"foo">> jest trzyczęściowym ciągiem foo (w/o"), a 34 jest kolejnym ". – Zed

+0

Bez względu na to, że twoje wyjaśnienie dotyczące jodu jest jeszcze inny problem." Foo "nie jest prawidłowy JSON i nie można go przetłumaczyć na prawidłowy JSON –