

# Prácticas recomendadas para la lectura de datos JSON
<a name="parsing-json-data"></a>

JavaScript Object Notation (JSON) es una forma habitual de codificar estructuras de datos como texto. Numerosas aplicaciones y herramientas generan datos con codificación JSON.

En Amazon Athena puede crear tablas a partir de datos externos e incluir en ellas datos con codificación JSON. Para dichos tipos de datos de origen, utilice Athena junto con [Bibliotecas de SerDe JSON](json-serde.md). 

Utilice los siguientes consejos para leer datos con codificación JSON:
+ Elija el SerDe adecuado, un SerDe JSON nativo, `org.apache.hive.hcatalog.data.JsonSerDe` o un SerDe OpenX, `org.openx.data.jsonserde.JsonSerDe`. Para obtener más información, consulte [Bibliotecas de SerDe JSON](json-serde.md).
+ Asegúrese de que cada registro codificado en JSON se represente en una línea separada, no en un formato de impresión.
**nota**  
El SerDe espera que cada documento JSON esté en una sola línea de texto sin caracteres de terminación de línea que separen los campos del registro. Si el texto JSON está en formato de impresión, puede recibir un mensaje de error como HIVE\$1CURSOR\$1ERROR: la fila no es un objeto JSON válido o HIVE\$1CURSOR\$1ERROR: JsonParseException: fin de entrada inesperado: marcador de cierre esperado para OBJECT cuando intenta consultar la tabla después de crearla. Para obtener más información, consulte los [JSON Data Files](https://github.com/rcongiu/Hive-JSON-Serde#json-data-files) (Archivos de datos JSON) en la documentación de OpenX SerDE en GitHub. 
+ Genere los datos con codificación JSON en columnas que no distingan entre mayúsculas y minúsculas.
+ Proporcione una opción para omitir los registros con formato incorrecto, como en este ejemplo.

  ```
  CREATE EXTERNAL TABLE json_table (
    column_a string,
    column_b int
   )
   ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
   WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true')
   LOCATION 's3://amzn-s3-demo-bucket/path/';
  ```
+ Convierta los campos de los datos de origen que tengan un esquema indeterminado en cadenas con codificación JSON en Athena.

Cuando Athena crea tablas basadas en datos JSON, analiza los datos en función del esquema predefinido y existente. Sin embargo, puede que no todos los datos tengan un esquema predefinido. Para simplificar la administración del esquema en estos casos, a menudo es útil convertir los campos de los datos de origen que tengan un esquema indeterminado en cadenas JSON en Athena y, a continuación, usar [Bibliotecas de SerDe JSON](json-serde.md).

Por ejemplo, imaginemos una aplicación IoT que publica eventos con campos comunes de diferentes sensores. Uno de los campos debe almacenar una carga personalizada específica del sensor que envía el evento. En este caso, habida cuenta de que no conocemos el esquema, recomendamos almacenar la información como una cadena codificada en JSON. Para ello, convierta los datos de la tabla de Athena a JSON, como en el ejemplo siguiente. También puede convertir datos con codificación JSON a los tipos de datos de Athena.

**Topics**
+ [Conversión de los tipos de datos de Athena a JSON](converting-native-data-types-to-json.md)
+ [Conversión de JSON a los tipos de datos de Athena](converting-json-to-native-data-types.md)

# Conversión de los tipos de datos de Athena a JSON
<a name="converting-native-data-types-to-json"></a>

Para convertir los tipos de datos de Athena a JSON, utilice `CAST`.

```
WITH dataset AS (
  SELECT
    CAST('HELLO ATHENA' AS JSON) AS hello_msg,
    CAST(12345 AS JSON) AS some_int,
    CAST(MAP(ARRAY['a', 'b'], ARRAY[1,2]) AS JSON) AS some_map
)
SELECT * FROM dataset
```

Esta consulta devuelve:

```
+-------------------------------------------+
| hello_msg      | some_int | some_map      |
+-------------------------------------------+
| "HELLO ATHENA" | 12345    | {"a":1,"b":2} |
+-------------------------------------------+
```

# Conversión de JSON a los tipos de datos de Athena
<a name="converting-json-to-native-data-types"></a>

Para convertir los datos JSON a tipos de Athena, utilice `CAST`.

**nota**  
En este ejemplo, para indicar que las cadenas tienen codificación JSON, comience con la palabra clave `JSON` y use comillas simples, por ejemplo `JSON '12345'` 

```
WITH dataset AS (
  SELECT
    CAST(JSON '"HELLO ATHENA"' AS VARCHAR) AS hello_msg,
    CAST(JSON '12345' AS INTEGER) AS some_int,
    CAST(JSON '{"a":1,"b":2}' AS MAP(VARCHAR, INTEGER)) AS some_map
)
SELECT * FROM dataset
```

Esta consulta devuelve:

```
+-------------------------------------+
| hello_msg    | some_int | some_map  |
+-------------------------------------+
| HELLO ATHENA | 12345    | {a:1,b:2} |
+-------------------------------------+
```