JSON

qué es JSON

Aprende JSON en 10 minutos

Tutorial de JSON

Ejemplo:

xml json
<listado>
  <persona>
      <nombre>Juan</nombre>
      <apellidos>Palomo</apellidos>
      <fecha>20/10/1980</fecha>
  </persona>
  <persona>
    <nombre>Pepe</nombre>
    <apellidos>Gotera</apellidos>
    <fecha>7/8/1990</fecha>
  </persona>
</listado>
{"listado": [
             {
          "nombre":"Juan", 
          "apellidos":"Palomo", 
          "fecha": "20/10/1980"
         },
         {
          "nombre": "Pepe", 
          "apellidos": "Gotera", 
          "fecha": "7/8/1990"
        }
      ]
}

Ejemplo: repositorios de un usuario en GitHub

https://api.github.com/users/paco-portada/repos

Json Viewer Tools

Online JSON Viewer

JSONLint – The JSON Validator

Extensión JSONView: Permite abrir documentos JSON en el navegador Firefox.

Json y Android

Clase JSONObject

  JSONObject(String json) Creates a new JSONObject with name/value mappings from the JSON string.
  getInt(String name) Returns the value mapped by name if it exists and is an int or can becoerced to an int, or throws otherwise.
  getString(String name) Returns the value mapped by name if it exists, coercing it if necessary, or throws if no such mapping exists.
  getJSONObject(String name) Returns the value mapped by name if it exists and is a JSONObject, or throws otherwise.
  put(String name, int value) Maps name to value, clobbering any existing name/value mapping with the same name.
  toString()  Encodes this object as a compact JSON string.

Clase JSONArray

  JSONArray(String json) Creates a new JSONArray with values from the JSON string.
  toString(int indentSpaces) Encodes this array as a human readable JSON string for debugging
  getJSONArray(String name) Returns the value mapped by name if it exists and is a JSONArray or throws otherwise

Parsing JSON in Android

Ejemplo: Lista de contactos

Crear una aplicación que lea una lista de contactos almacenada en un fichero en formato json (situado en la carpeta res/raw o en la tarjeta de memoria).
Cada contacto contendrá los campos: nombre, dirección, email y teléfono. En el teléfono se podrán guardar tres valores (casa, móvil y trabajo).

Estructura del proyecto:

¿contactos.json?

 

añadir contactos.json a la carpeta res/raw

 

view Binding en build.gradle

buildFeatures {
    viewBinding = true
}

acitvity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Lista de contactos"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.022" />

    <Switch
        android:id="@+id/switch1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="false"
        android:text="Gson"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.95"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:layout_marginBottom="16dp"
        android:text="Mostrar"
        app:layout_constraintBottom_toTopOf="@+id/recyclerView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.462"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="362dp"
        android:layout_height="561dp"
        android:layout_marginBottom="28dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.326"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button" />

</androidx.constraintlayout.widget.ConstraintLayout>

item_contact.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">

    <TextView
        android:id="@+id/contact_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="name"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        android:textColor="#2196F3" />

    <TextView
        android:id="@+id/mobile_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />

</LinearLayout>

Telefono.java

public class Telefono {

    private String casa;
    private String movil;
    private String trabajo;

    public String getCasa() {
        return casa;
    }
    public void setCasa(String casa){
        this.casa = casa;
    }
    public String getMovil() {
        return movil;
    }
    public void setMovil(String movil) {
        this.movil = movil;
    }
    public String getTrabajo() {
        return trabajo;
    }
    public void setTrabajo(String trabajo) {
        this.trabajo = trabajo;
    }

}

Contacto.java

public class Contacto {
    private String nombre;
    private String direccion;
    private String email;
    private Telefono telefono;

    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public String getDireccion() {
        return direccion;
    }
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Telefono getTelefono() {
        return telefono;
    }
    public void setTelefono(Telefono telefono) {
        this.telefono = telefono;
    }

    public String toString() {
        return nombre;
    }

}

ContactosAdapter.java

// Create the basic adapter extending from RecyclerView.Adapter
// Note that we specify the custom ViewHolder which gives us access to our views
public class ContactosAdapter extends RecyclerView.Adapter<ContactosAdapter.ViewHolder> {

    // Store a member variable for the contacts
    private List<Contacto> mContactos;

    // Pass in the contact array into the constructor
    public ContactosAdapter(List<Contacto> contactos) {
        mContactos = contactos;
    }

     // Provide a direct reference to each of the views within a data item
    // Used to cache the views within the item layout for fast access
    public class ViewHolder extends RecyclerView.ViewHolder{
        // Your holder should contain a member variable
        // for any view that will be set as you render a row
        public TextView nameTextView;
        public TextView mobileTextView;

        // We also create a constructor that accepts the entire item row
        // and does the view lookups to find each subview
        public ViewHolder(View itemView) {
            // Stores the itemView in a public final member variable that can be used
            // to access the context from any ViewHolder instance.
            super(itemView);

            nameTextView = (TextView) itemView.findViewById(R.id.contact_name);
            mobileTextView = (TextView) itemView.findViewById(R.id.mobile_phone);
        }
     }

    // Usually involves inflating a layout from XML and returning the holder
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        // Inflate the custom layout
        View contactView = inflater.inflate(R.layout.item_contact, parent, false);

        // Return a new holder instance
        ViewHolder viewHolder = new ViewHolder(contactView);
        return viewHolder;
    }

    // Involves populating data into the item through holder
    @Override
    public void onBindViewHolder(ContactosAdapter.ViewHolder holder, int position) {
        // Get the data model based on position
        Contacto contact = mContactos.get(position);

        // Set item views based on your views and data model
        TextView textView1 = holder.nameTextView;
        textView1.setText(contact.getNombre());
        TextView textView2 = holder.mobileTextView;
        textView2.setText(contact.getTelefono().getMovil());
    }

    // Returns the total count of items in the list
    @Override
    public int getItemCount() {
        return mContactos.size();
    }

    public void actualizar(List<Contacto> data) {
        this.mContactos = data;
        notifyDataSetChanged();
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    public static final int CONTACTOS = R.raw.contactos;
    public static final int CONTACTS = R.raw.contacts;
    private ActivityMainBinding binding;
    ArrayList<Contacto> contactos = null;
    ContactosAdapter adapter;
    String contenido;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);

        binding.button.setOnClickListener(this);

        // onClick(binding.button);
    }

    @Override
    public void onClick(View v) {
        if (v == binding.button) {
            obtenerContactos();
            if (contactos != null)
                if (adapter != null) {
                    // adapter.notifyDataSetChanged();
                    // adapter.notifyItemRangeChanged(0, contactos.size());
                    adapter.actualizar(contactos);
                } else
                    crearAdapter();
            else
                mostrarMensaje("Error al obtener los contactos");
        }
    }

    private void crearAdapter() {
        // Create adapter passing in the sample user data
        adapter = new ContactosAdapter(contactos);
        // Attach the adapter to the recyclerview to populate items
        binding.recyclerView.setAdapter(adapter);
        // Set layout manager to position the items
        binding.recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }

    public void obtenerContactos() {
        // Initialize contacts
        try {
            if (!binding.switch1.isChecked()) {
                // Analizar contactos
                contenido = leerFicheroRaw(CONTACTOS);
                contactos = Analisis.analizarContactos(contenido);
            } else {
                // usar Gson



            }
        } catch (JSONException | IOException e) {
            //e.printStackTrace();
            Log.e("Error: ", e.getMessage());
            mostrarMensaje("Error: " + e.getMessage());
        } catch ( JsonSyntaxException ex) {
            Log.e("Error: ", ex.getMessage());
            mostrarMensaje("Error: " + ex.getMessage());
        }
    }

    public String leerFicheroRaw(int id) throws IOException {
        StringBuilder cadena = new StringBuilder();

        String linea = "";
        InputStream in = getApplicationContext().getResources().openRawResource(id);

        // Otra forma
        // String filePath = "res/raw/fichero_raw";
        // InputStream in = this.getClass().getClassLoader().getResourceAsStream(filePath);

        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        while ((linea = br.readLine()) != null) {
            cadena.append(linea + "\n");
        }
        in.close();

        return cadena.toString();
    }

    private void mostrarMensaje(String texto) {
        Toast.makeText(this, texto, Toast.LENGTH_SHORT).show();
    }

}

Análisis del fichero json

utils/Analisis.java

public class Analisis {

    public static ArrayList<Contacto> analizarContactos(String cadena) throws JSONException {
        JSONArray jAcontactos;
        JSONObject objeto, jOcontacto, jOtelefono;
        Contacto contacto;
        Telefono telefono;
        ArrayList<Contacto> personas = new ArrayList<>();

        // añadir contactos (en formato JSON) a personas





    }
}

 

Deja una respuesta