14. Conexión JSON

Las aplicaciones Web suelen usar JSON (JavaScript Object Notation) para intercambiar datos.
Con la librería dart:json podemos generar y cargar datos con formato JSON.

Dart contiene dos funciones principales para trabajar con cadenas JSON:
  • parse () : Pasa de JSON a Dart
  • stringify ()  : Pasa de Dart a JSON
Ambas funciones convierten los tipos de datos automaticamente: num, String, bool, null, List, Map.

El siguiente programa toma una cadena JSON la muestra en el DOM y actualiza la cadena JSON si se modifican en el DOM.




Fases del programa ficha_json.dart:
  • Llena la ficha en formato JSON en la función populateFromJson:
    • void populateFromJson() {
        String jsonDataAsString =''' 
        { "edad":46, ...  }
        ''';
        Map jsonData = json.parse(jsonDataAsString);
  • Extrae las cadenas para rellenar los inputs con cada dato:
    • edad = jsonData['edad'].toString();
Al cambiar los inputs, reconstruye la ficha JSON:
  • Convierte las cadenas de los inputs en cada tipo de variable
    • num edad_json = int.parse(edad);
  • LLena el Map con todos las etiquetas y variables:
    • Map formData = {'edad': edad_json,'altura': altura_json,...
  • Convierte a formato JSON:
    • mapAsJson = json.stringify(formData);


ficha_json.dart
import 'dart:html';
import 'dart:json' as json;
     
String mapAsJson;
String edad='';
String altura='';
String nombre='';
String familia1='';
String familia2='';
String familia3='';
String chocolate='';
     
void main() {
  populateFromJson(); 
  showJson();
}
      
//Funcion crea una cadena con el contenido JSON
void populateFromJson() {
  String jsonDataAsString =''' 
  { "edad":46,
    "altura":1.80,
    "nacionalidad":true,
    "nombre":"Óscar Romero",
    "familia":["Maribel","Laura","Nicolás"]
  }
  ''';
  //Pasa la cadena al formato JSON
  Map jsonData = json.parse(jsonDataAsString);
  //Extrae cada elemento del formato JSON en cadenas
  edad = jsonData['edad'].toString();
  altura = jsonData['altura'].toString();
  nombre = jsonData['nombre'];
  familia1 = jsonData['familia'][0];
  familia2 = jsonData['familia'][1];
  familia3 = jsonData['familia'][2];
  if (jsonData['nacionalidad']) {
    var anElement = query('#true');
    anElement.checked = true;
  } else {
    var anElement = query('#false');
    anElement.checked = true;
  }
}
      
//Funcion crea el formato JSON
void showJson() {
  num edad_json = int.parse(edad);
  num altura_json = double.parse(altura);
  var anElement = query('#true');
  bool nacionalidad_json = anElement.checked ? true : false;
  List<String> familia_json = [ familia1, familia2, familia3 ];
  Map formData = {
    'edad': edad_json,
    'altura': altura_json,
    'nacionalidad': nacionalidad_json,
    'nombre': nombre,
    'familia': familia_json
  };
  // Convierte todo a JSON
  mapAsJson = json.stringify(formData);
}


ficha_json.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Ficha JSON</title>
    <link rel="stylesheet" href="ficha_json.css">
  </head>
  <body>
    <h1>Ficha en formato JSON</h1>
    <table>
      <tbody>
      <tr>
        <td align="right">Edad(integer):</td>
        <td><input type="text" bind-value="edad" on-change="showJson()"></td>
      </tr>
      <tr>
        <td align="right">Altura(double):</td>
        <td><input type="text" bind-value="altura" on-change="showJson()"></td>
      </tr>
      <tr>
        <td align="right">Nombre(string):</td>
        <td><input type="text" bind-value="nombre" on-change="showJson()"></td>
      </tr>
      <tr>
        <td align="right">Miembros de la familia: List&ltString&gt</td>
        <td>
          <input type="text" bind-value="familia1" on-change="showJson()">
          <input type="text" bind-value="familia2" on-change="showJson()">
          <input type="text" bind-value="familia3" on-change="showJson()">
        </td>
      </tr>
      <tr>
        <td align="right">Nacionalidad (bool):</td>
        <td><input type="radio" on-change="showJson()" name="chocolate" value="true" id="true" checked="checked">Español
            <input type="radio" on-change="showJson()" name="chocolate" value="false" id="false">Extranjero
        </td>
      </tr>
      </tbody>
    </table>
    <div class="givemespace">
      <label>Ficha en formato JSON</label><br>
      <textarea id="mapasjson" readonly>{{ mapAsJson }}</textarea>
    </div>
    <script type="application/dart" src="ficha_json.dart"></script>
    <script src="packages/browser/dart.js"></script>
  </body>
</html>


ficha_json.css
body {
  background-color: #F8F8F8;
  font-family: 'Open Sans', sans-serif;
  font-size: 14px;
  font-weight: normal;
  line-height: 1.2em;
  margin: 15px;
}
h1, p {
  color: #333;
}
#sample_container_id {
  width: 100%;
  height: 400px;
  position: relative;
  border: 1px solid #ccc;
  background-color: #fff;
}
.givemespace {
  margin-top: 15px;
}
table {
  text-align: left;
  border-spacing: 5px 15px
}
.result {
  background-color: Ivory;
  padding: 5px 5px 5px 5px;
  border: 1px solid black;
}
input {
  display: block;
}
input[type="radio"] {
  display: inline;
}
#mapasjson {
  background-color: Ivory;
  padding: 5px 5px 5px 5px;
  margin-top: 15px;
  border: 1px solid black;
  width: 500px;
  height: 50px;
  font-size:14px;
}
label {
  font-weight: bold;
}

No hay comentarios: