JSON
qué es 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
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).

¿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
Lo siento, debes estar conectado para publicar un comentario.