Tengo este archivo JSON que me gustaría usar para mi aplicación móvil para mi proyecto universitario, sin embargo, tengo problemas para acceder a la sección "campos" y no estoy seguro de cuál es la mejor manera de acceder.

{"total_hits":47287,"max_score":11.854574,
"hits":[
{"_index":"f762ef22-e660-434f-9071-a10ea6691c27",
"_type":"item",
"_id":"513fceb375b8dbbc21000022",
"_score":11.854574,

    "fields":{
    "item_id":"513fceb375b8dbbc21000022",
    "item_name":"Cheese, cheddar - 1 cup, diced",       
    "brand_name":"USDA",    
    "nf_calories":533.28,
    "nf_total_fat":43.97,
    "nf_cholesterol":130.68,
    "nf_sodium":861.96,
    "nf_serving_size_qty":1,
    "nf_serving_size_unit":"serving"}},

{"_index":"f762ef22-e660-434f-9071-a10ea6691c27",
"_type":"item",
"_id":"513fceb375b8dbbc21000021",
"_score":11.800501,

     "fields":{"item_id":"513fceb375b8dbbc21000021",
     "item_name":"Cheese, cheddar - 1 cup, melted",
     "brand_name":"USDA",
     "nf_calories":985.76,
     "nf_total_fat":81.28,
     "nf_cholesterol":241.56,
     "nf_sodium":1593.32,
     "nf_serving_size_qty":1,
     "nf_serving_size_unit":"serving"}}, ... etc.

Puedo acceder al valor _Score en la primera sección, sin embargo, estoy buscando acceder a elementos como item_name y nf_calories, sin embargo, no estoy seguro de la sintaxis. Creo que entiendo lo que tengo que hacer, pero no puedo visualizarlo en mi cabeza.

JSONObject parentObject = new JSONObject(finalJson);
JSONArray parentArray = parentObject.getJSONArray("hits");


            List<NutritionModel> nutModelList = new ArrayList<>();


            for(int i=0; i<parentArray.length(); i++) {

                hitsObject = parentArray.getJSONObject(i);
                NutritionModel nutModel = new NutritionModel();

                nutModel.set_score(hitsObject.getDouble("_score"));


                //Adding final object in the list
                nutModelList.add(nutModel);

Esto es lo que tengo actualmente en mi archivo ViewNutrition.java.

public class NutritionModel {

private Double _score;

public Array getFieldarray() {
    return fieldarray;
}

public void setFieldarray(Array fieldarray) {
    this.fieldarray = fieldarray;
}

private Array fieldarray;
private String item_name;
private Double nf_calories;
private Double nf_total_fat;
private Double nf_protein;
private Double nf_cholesterol;
private Double nf_sodium;
private Double nf_serving_size_qty;


public Double get_score() {
    return _score;
}

    public void set_score(Double _score) {
    this._score = _score;
}

    public String getItem_name() {
        return item_name;
    }

    public void setItem_name(String item_name) {
        this.item_name = item_name;
    }

    public Double getNf_calories() {
        return nf_calories;
    }

    public void setNf_calories(Double nf_calories) {
        this.nf_calories = nf_calories;
    }

    public Double getNf_total_fat() {
        return nf_total_fat;
    }

    public void setNf_total_fat(Double nf_total_fat) {
        this.nf_total_fat = nf_total_fat;
    }

    public Double getNf_protein() {
        return nf_protein;
    }

    public void setNf_protein(Double nf_protein) {
        this.nf_protein = nf_protein;
    }

    public Double getNf_cholesterol() {
        return nf_cholesterol;
    }

    public void setNf_cholesterol(Double nf_cholesterol) {
        this.nf_cholesterol = nf_cholesterol;
    }

    public Double getNf_sodium() {
        return nf_sodium;
    }

    public void setNf_sodium(Double nf_sodium) {
        this.nf_sodium = nf_sodium;
    }

    public Double getNf_serving_size_qty() {
        return nf_serving_size_qty;
    }

    public void setNf_serving_size_qty(Double nf_serving_size_qty) {
        this.nf_serving_size_qty = nf_serving_size_qty;
    }
}

Esto es lo que está actualmente en mi clase personalizada para usar los datos JSON.

Intenté recorrer un JSONObject con una declaración for, buscando un JSONObject llamado "campos", sin embargo, todavía devuelve resultados nulos. He estado estancado por un par de días y realmente estoy luchando, ¡cualquier ayuda o dirección sería apreciada! Gracias.

1
learning2program 15 dic. 2016 a las 23:46

2 respuestas

La mejor respuesta

Para acceder a elementos como item_name y nf_calories use, debe acceder a la matriz interna. Entonces, ¿cómo hacerlo?

JSONObject parentObject = new JSONObject(finalJson);
JSONArray parentArray = parentObject.getJSONArray("hits");

Supongamos que necesita acceder a los elementos (item_name, etc.) de "hits" en el índice i, luego, debe ir al JSONObject interno llamado "fields" y luego necesita acceder a la clave llamada "item_name" para ese hacer-

for(int i=0;i<parentArray.length();i++) {
    JSONObject obj1=parentArray.getJSONObject(i);
    JSONObject obj2= obj1.getJSONObject("fields");
    String item_name=obj2.getString("item_name");
}

De todos modos, incluso si se confunde en la explicación, para una mejor visualización de JSON acceda a este sitio web: http://jsonviewer.stack.hu /

0
Avinash Saran 15 dic. 2016 a las 21:35

El objeto Field no es una matriz, es un objeto. Le sugiero que cree una clase FieldModel y que la clase NutritionModel contenga una instancia de la clase FieldModel.

// In parser class
nutModel.setFields(hitsObject.getJSONObject("fields"));

// In NutritionModel class
public void setFields(JSONObject obj) {
  this.fields.item_name = obj.getString("item_name");
  // etc
}
0
mWhitley 15 dic. 2016 a las 21:07