No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

124 líneas
5.2 KiB

hace 14 años
  1. Jiffy - JSON NIFs for Erlang
  2. ============================
  3. A JSON parser as a NIF. This is a complete rewrite of the work I did
  4. in EEP0018 that was based on Yajl. This new version is a hand crafted
  5. state machine that does its best to be as quick and efficient as
  6. possible while not placing any constraints on the parsed JSON.
  7. [![Build Status](https://travis-ci.org/davisp/jiffy.svg?branch=master)](https://travis-ci.org/davisp/jiffy)
  8. Usage
  9. -----
  10. Jiffy is a simple API. The only thing that might catch you off guard
  11. is that the return type of `jiffy:encode/1` is an iolist even though
  12. it returns a binary most of the time.
  13. A quick note on unicode. Jiffy only understands UTF-8 in binaries. End
  14. of story.
  15. Errors are raised as exceptions.
  16. Eshell V5.8.2 (abort with ^G)
  17. 1> jiffy:decode(<<"{\"foo\": \"bar\"}">>).
  18. {[{<<"foo">>,<<"bar">>}]}
  19. 2> Doc = {[{foo, [<<"bing">>, 2.3, true]}]}.
  20. {[{foo,[<<"bing">>,2.3,true]}]}
  21. 3> jiffy:encode(Doc).
  22. <<"{\"foo\":[\"bing\",2.3,true]}">>
  23. `jiffy:decode/1,2`
  24. ------------------
  25. * `jiffy:decode(IoData)`
  26. * `jiffy:decode(IoData, Options)`
  27. The options for decode are:
  28. * `return_maps` - Tell Jiffy to return objects using the maps data type
  29. on VMs that support it. This raises an error on VMs that don't support
  30. maps.
  31. * `{null_term, Term}` - Returns the specified `Term` instead of `null`
  32. when decoding JSON. This is for people that wish to use `undefined`
  33. instead of `null`.
  34. * `use_nil` - Returns the atom `nil` instead of `null` when decoding
  35. JSON. This is a short hand for `{null_term, nil}`.
  36. * `return_trailer` - If any non-whitespace is found after the first
  37. JSON term is decoded the return value of decode/2 becomes
  38. `{has_trailer, FirstTerm, RestData::iodata()}`. This is useful to
  39. decode multiple terms in a single binary.
  40. * `return_truncated` - If the JSON passed to the decoder is incomplete
  41. return `{truncated, Pos}`, where `Pos`, is the length of JSON read
  42. before hitting the end of the interpretable term.
  43. * `dedupe_keys` - If a key is repeated in a JSON object this flag
  44. will ensure that the parsed object only contains a single entry
  45. containing the last value seen. This mirrors the parsing beahvior
  46. of virtually every other JSON parser.
  47. * `copy_strings` - Normaly when strings are decoded they are created
  48. as sub-binaries of the input data. With some workloads this can lead
  49. to an undeseriable bloating of memory when a few small strings in JSON
  50. keep a reference to the full JSON document alive. Setting this option
  51. will instead allocate new binaries for each string to avoid keeping
  52. the original JSON document around after garbage collection.
  53. * `{bytes_per_red, N}` where N &gt;= 0 - This controls the number of
  54. bytes that Jiffy will process as an equivalent to a reduction. Each
  55. 20 reductions we consume 1% of our allocated time slice for the current
  56. process. When the Erlang VM indicates we need to return from the NIF.
  57. * `{bytes_per_iter, N}` where N &gt;= 0 - Backwards compatible option
  58. that is converted into the `bytes_per_red` value.
  59. `jiffy:encode/1,2`
  60. ------------------
  61. * `jiffy:encode(EJSON)`
  62. * `jiffy:encode(EJSON, Options)`
  63. where EJSON is a valid representation of JSON in Erlang according to
  64. the table below.
  65. The options for encode are:
  66. * `uescape` - Escapes UTF-8 sequences to produce a 7-bit clean output
  67. * `pretty` - Produce JSON using two-space indentation
  68. * `force_utf8` - Force strings to encode as UTF-8 by fixing broken
  69. surrogate pairs and/or using the replacement character to remove
  70. broken UTF-8 sequences in data.
  71. * `use_nil` - Encode's the atom `nil` as `null`.
  72. * `escape_forward_slashes` - Escapes the `/` character which can be
  73. useful when encoding URLs in some cases.
  74. * `{bytes_per_red, N}` - Refer to the decode options
  75. * `{bytes_per_iter, N}` - Refer to the decode options
  76. Data Format
  77. -----------
  78. Erlang JSON Erlang
  79. ==========================================================================
  80. null -> null -> null
  81. true -> true -> true
  82. false -> false -> false
  83. "hi" -> [104, 105] -> [104, 105]
  84. <<"hi">> -> "hi" -> <<"hi">>
  85. hi -> "hi" -> <<"hi">>
  86. 1 -> 1 -> 1
  87. 1.25 -> 1.25 -> 1.25
  88. [] -> [] -> []
  89. [true, 1.0] -> [true, 1.0] -> [true, 1.0]
  90. {[]} -> {} -> {[]}
  91. {[{foo, bar}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
  92. {[{<<"foo">>, <<"bar">>}]} -> {"foo": "bar"} -> {[{<<"foo">>, <<"bar">>}]}
  93. #{<<"foo">> => <<"bar">>} -> {"foo": "bar"} -> #{<<"foo">> => <<"bar">>}
  94. N.B. The last entry in this table is only valid for VM's that support
  95. the `maps` data type (i.e., 17.0 and newer) and client code must pass
  96. the `return_maps` option to `jiffy:decode/2`.
  97. Improvements over EEP0018
  98. -------------------------
  99. Jiffy should be in all ways an improvement over EEP0018. It no longer
  100. imposes limits on the nesting depth. It is capable of encoding and
  101. decoding large numbers and it does quite a bit more validation of UTF-8 in strings.