# Type Mapping

    library(RJSONIO)

JSON and R have similar but not identical type systems. This article summarizes the common mappings used by `fromJSON()` and `toJSON()`.

## JSON to R

    #>         JSON                                            R
    #> 1     object        named list or simplified named vector
    #> 2      array             list or simplified vector/matrix
    #> 3     string                                    character
    #> 4     number                                      numeric
    #> 5 true/false                                      logical
    #> 6       null NULL or the value supplied through nullValue

    str(fromJSON('{"a": 1, "b": 2}', simplify = FALSE))
    #> List of 2
    #>  $ a: num 1
    #>  $ b: num 2
    str(fromJSON("[1, 2, 3]"))
    #>  num [1:3] 1 2 3
    str(fromJSON('["a", "b", "c"]'))
    #>  chr [1:3] "a" "b" "c"
    str(fromJSON("[true, false]"))
    #>  logi [1:2] TRUE FALSE
    str(fromJSON("[1, null, 3]", nullValue = NA, simplify = TRUE))
    #>  num [1:3] 1 NA 3

## R to JSON

    #>                     R                              JSON
    #> 1          named list                            object
    #> 2        unnamed list                             array
    #> 3       atomic vector                             array
    #> 4 named atomic vector                            object
    #> 5              matrix                      nested array
    #> 6          data.frame object by column, or array by row
    #> 7                  NA                              null
    #> 8                NULL                              null

    toJSON(list(a = 1, b = TRUE))
    #> [1] "{\n \"a\":        1,\n\"b\": true \n}"
    toJSON(list(1, TRUE, "x"))
    #> [1] "[\n        1,\ntrue,\n\"x\" \n]"
    toJSON(c(1, 2, 3))
    #> [1] "[        1,        2,        3 ]"
    toJSON(c(a = 1, b = 2))
    #> [1] "{\n \"a\":        1,\n\"b\":        2 \n}"
    toJSON(matrix(1:4, nrow = 2))
    #> [1] "[ [ 1, 3 ],\n[ 2, 4 ] ]"
    toJSON(data.frame(a = 1:2, b = c("x", "y")))
    #> [1] "{\n \"a\": [ 1, 2 ],\n\"b\": [ \"x\", \"y\" ] \n}"
    toJSON(NA)
    #> [1] "[ null ]"
    toJSON(NULL)
    #> [1] "[ null ] "

## Empty containers

Empty containers can carry different meaning depending on names.

    toJSON(list())
    #> [1] "[]"
    toJSON(emptyNamedList)
    #> [1] "{}"

    fromJSON("[]")
    #> list()
    fromJSON("{}")
    #> named list()

## Simplification constants

The exported constants can be combined to control simplification.

    Strict
    #> [1] 14
    StrictNumeric
    #> [1] 4
    StrictCharacter
    #> [1] 8
    StrictLogical
    #> [1] 2

    fromJSON('[1, true]', simplify = Strict)
    #> [[1]]
    #> [1] 1
    #>
    #> [[2]]
    #> [1] TRUE
    fromJSON('[1, true]', simplify = TRUE)
    #> [1] 1 1