Convertir una cadena de caracteres a formato JSON en R

Cuando conectamos MongoDB a R, podemos importar archivos JSON en nuestro entorno de trabajo en R. Sin embargo, en algunas ocasiones estos datos con estructura JSON no se interpretan como tal en R. En su lugar, se ven como una cadena de caracteres. Sin embargo, convertir una cadena de caracteres a formato JSON en R es sencillo.

Quiero leer...

Convertir una cadena de caracteres a formato JSON en R

Vamos a comenzar con un ejemplo de formato JSON cargado en R como cadena de caracteres. Vamos a llamar al objeto de R como x.

x <- '[{"code":"B1182","description":"Tire pressure monitor module","faultInformations":[{"description":"---"},{"description":"TRUE","description_eng":"TRUE","description_fre":"TRUE","description_ger":"TRUE","description_spa":"TRUE","description_ita":"TRUE","description_tur":"TRUE"}],"freezeFrames":[],"enhancedDtcInfos":[],"status":"ACTIVE","system":"MULTIFUNCTION","systemMeta":{"systemName":null,"subSystemName":null},"description_eng":"Tire pressure monitor module","description_fre":"Module de surveillance de la pression des pneus","description_ger":"Reifendrucküberwachung","description_spa":"Módulo de control de la presión de los neumáticos","description_ita":"Modulo monitor di pressione pneumatico","description_tur":"Lastik basıncı izleme modülü"},{"code":"B124D","description":"Sensor, tyre pressure","faultInformations":[{"description":"---"},{"description":"TRUE","description_eng":"TRUE","description_fre":"TRUE","description_ger":"TRUE","description_spa":"TRUE","description_ita":"TRUE","description_tur":"TRUE"}],"freezeFrames":[],"enhancedDtcInfos":[],"status":"ACTIVE","system":"MULTIFUNCTION","systemMeta":{"systemName":null,"subSystemName":null},"description_eng":"Sensor, tyre pressure","description_fre":"Capteur, pression des pneus","description_ger":"Sensor Reifendruck","description_spa":"Sensor de presión del neumático","description_ita":"Sensore, pressione pneumatici","description_tur":"Sensör, lastik hava basıncı"}]'

Aparentemente es un montón de código sin estructurar, mal ordenado y muy lioso. Sin embargo, si le damos formato HTML o JSON vemos mucho mejor su estructura.

[ {
    "code":"B1182",
    "description":"Tire pressure monitor module",
    "faultInformations":[ {
        "description": "---"
    },
    {
        "description": "TRUE", "description_eng": "TRUE", "description_fre": "TRUE", "description_ger": "TRUE", "description_spa": "TRUE", "description_ita": "TRUE", "description_tur": "TRUE"
    } ],
    "freezeFrames":[],
    "enhancedDtcInfos":[],
    "status":"ACTIVE",
    "system":"MULTIFUNCTION",
    "systemMeta": {
        "systemName": null, "subSystemName": null
    }
    ,
    "description_eng":"Tire pressure monitor module",
    "description_fre":"Module de surveillance de la pression des pneus",
    "description_ger":"Reifendrucküberwachung",
    "description_spa":"Módulo de control de la presión de los neumáticos",
    "description_ita":"Modulo monitor di pressione pneumatico",
    "description_tur":"Lastik basıncı izleme modülü"
},
 {
     "code":"B124D",
     "description":"Sensor, tyre pressure",
     "faultInformations":[ {
         "description": "---"
     },
     {
         "description": "TRUE", "description_eng": "TRUE", "description_fre": "TRUE", "description_ger": "TRUE", "description_spa": "TRUE", "description_ita": "TRUE", "description_tur": "TRUE"
     }
     ],
     "freezeFrames":[],
     "enhancedDtcInfos":[],
     "status":"ACTIVE",
     "system":"MULTIFUNCTION",
     "systemMeta": {
         "systemName": null, "subSystemName": null
     },
     "description_eng":"Sensor, tyre pressure",
     "description_fre":"Capteur, pression des pneus",
     "description_ger":"Sensor Reifendruck",
     "description_spa":"Sensor de presión del neumático",
     "description_ita":"Sensore, pressione pneumatici",
     "description_tur":"Sensör, lastik hava basıncı"
 }
]

Pero como hemos dicho, una vez cargado en R no tiene formato JSON, sino de cadena de caracteres. Esto lo corroboramos viendo su estructura y clase, indicándonos que es "character".

str(x)
##  chr "[{\"code\":\"B1182\",\"description\":\"Tire pressure monitor module\",\"faultInformations\":[{\"description\":\"| __truncated__
class(x)
## [1] "character"

convertimos a json con jsonlite

Para poder convertir una cadena de caracteres a formato JSON en R podemos cargar el paquete jsonlite. Este paquete presenta una función, fromJSON(), que permite convertir una cadena de caracteres a JSON. Es importante mencionar que la cadena de caracteres tiene que tener la estructura de JSON, ya que de no ser así, daría error.

Vamos a convertir x en JSON, y le daremos el nombre de vector_json.

library(jsonlite)
vector_json <- fromJSON(x)

Ahora si vemos nuevamente la estructura y clase, nos indica que es un data frame, que es como se leen correctamente los JSON en R.

str(vector_json)
## 'data.frame':    2 obs. of  14 variables:
##  $ code             : chr  "B1182" "B124D"
##  $ description      : chr  "Tire pressure monitor module" "Sensor, tyre pressure"
##  $ faultInformations:List of 2
##   ..$ :'data.frame': 2 obs. of  7 variables:
##   .. ..$ description    : chr  "---" "TRUE"
##   .. ..$ description_eng: chr  NA "TRUE"
##   .. ..$ description_fre: chr  NA "TRUE"
##   .. ..$ description_ger: chr  NA "TRUE"
##   .. ..$ description_spa: chr  NA "TRUE"
##   .. ..$ description_ita: chr  NA "TRUE"
##   .. ..$ description_tur: chr  NA "TRUE"
##   ..$ :'data.frame': 2 obs. of  7 variables:
##   .. ..$ description    : chr  "---" "TRUE"
##   .. ..$ description_eng: chr  NA "TRUE"
##   .. ..$ description_fre: chr  NA "TRUE"
##   .. ..$ description_ger: chr  NA "TRUE"
##   .. ..$ description_spa: chr  NA "TRUE"
##   .. ..$ description_ita: chr  NA "TRUE"
##   .. ..$ description_tur: chr  NA "TRUE"
##  $ freezeFrames     :List of 2
##   ..$ : list()
##   ..$ : list()
##  $ enhancedDtcInfos :List of 2
##   ..$ : list()
##   ..$ : list()
##  $ status           : chr  "ACTIVE" "ACTIVE"
##  $ system           : chr  "MULTIFUNCTION" "MULTIFUNCTION"
##  $ systemMeta       :'data.frame':   2 obs. of  2 variables:
##   ..$ systemName   : logi  NA NA
##   ..$ subSystemName: logi  NA NA
##  $ description_eng  : chr  "Tire pressure monitor module" "Sensor, tyre pressure"
##  $ description_fre  : chr  "Module de surveillance de la pression des pneus" "Capteur, pression des pneus"
##  $ description_ger  : chr  "Reifendrucküberwachung" "Sensor Reifendruck"
##  $ description_spa  : chr  "Módulo de control de la presión de los neumáticos" "Sensor de presión del neumático"
##  $ description_ita  : chr  "Modulo monitor di pressione pneumatico" "Sensore, pressione pneumatici"
##  $ description_tur  : chr  "Lastik basıncı izleme modülü" "Sensör, lastik hava basıncı"
class(vector_json)
## [1] "data.frame"

Seleccionar un campo de JSON en R

Una vez que tenemos cargado en R el JSON original con su formato (vector_json), podemos seleccionar los elementos que contiene en su interior. Por ejemplo, si queremos ver cuántos códigos diferentes aparecen en el JSON (code), podemos verlo del siguiente modo:

vector_json$code
## [1] "B1182" "B124D"

Como hemos visto, aparecen dos códigos en el JSON, que son B1182 y B124D. Si estuviésemos interesados en ver la descripción de cada código (description), lo haríamos de un modo similar al caso anterior.

vector_json$description
## [1] "Tire pressure monitor module" "Sensor, tyre pressure"

Y veríamos que el código B1182 se describre como Tire pressure monitor module, y el código B124D como Sensor, tyre pressure.

Deja un comentario