【问题标题】:mochijson2 or mochijsonmochijson2 or mochijson
【发布时间】:2010-12-06 10:36:46
【问题描述】:

我正在使用 mochijson2 对一些数据进行编码。 但我发现它在作为列表的字符串上表现得很奇怪。

例子:

mochijson2:encode("foo").

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

其中“102”、“111”、“111”是编码为字符串的$f、$o、$o 44 是逗号,91 和 93 是方括号。

当然,如果我在某处输出它,我会得到字符串“[102,111,111]”,这显然不是我想要的。

如果我尝试

mochijson2:encode(>).

[34,>,34]

所以我再次得到一个包含两个双引号和二进制部分的列表,其中可以使用 list_to_binary/1 转换为二进制

这是一个问题 - 为什么它如此不一致。我知道区分应该编码为json数组的erlang列表和应该编码为json字符串的erlang字符串存在问题,但至少当我传递二进制文件时它可以输出二进制文件吗?

还有第二个问题: 看起来 mochijson 输出一切都很好(因为它使用特殊的元组来指定数组 {array, ...})

mochijson:encode(>).
"\"富\""

mochijson2 和 mochijson 有什么区别?表现? Unicode 处理?还有什么?

谢谢

【问题讨论】:

    标签: json erlang mochiweb


    【解决方案1】:

    我的猜测是 mochijson 中的决定是将二进制视为字符串,并将整数列表视为整数列表。 (不?)幸运的是,Erlang 中的字符串实际上是一个整数列表。

    因此,您的“foo”,或者换句话说,您的 [102,111,111] 被翻译成代表“[102,111,111]”的文本。在第二种情况下,您的 > 字符串变为 "foo"

    关于第二个问题,mochijson 似乎总是返回一个字符串,而 mochijson2 返回一个iodata 类型。 Iodata 基本上是字符串、二进制文件和 iodatas(实际上是 iolists)的递归列表。如果您只打算“通过线路”发送结果,则将它们嵌套在列表中比将它们转换为扁平字符串更有效。

    【讨论】:

    • 感谢您的回答,但仍不是一切都清楚。我猜:第二种情况你的 > 字符串变成 "foo" 是不正确的,或者 [34,>,34] 相当于 "foo" ? mochijson 中的 utf-8 支持怎么样?当我使用 mochijson2 时,我在编码器中添加了 {utf8, true} 选项。
    • 试试 erlang:iolist_to_binary([34,>,34])。 34 是单个 " 字符,> 是三个字符的长字符串 foo (w/o "),而 34 是另一个 ".
    • 不管你对 iodata 的解释还有另一个问题。 “foo”不是有效的 JSON,无法转换为有效的 JSON。
    • @Hynek:不确定你的意思。编码(或翻译)的唯一目的是将无效数据结构转换为有效数据结构。
    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2011-05-14
    • 2012-03-25
    • 2011-03-24
    • 2021-10-13
    相关资源
    最近更新 更多