как получить все значения ключа из вложенного json - PullRequest
0 голосов
/ 02 августа 2020

, например, у меня есть объект json вроде этого:

{
"pic":"1.jpg",
"products":[
{
"id":1,
"pic":"4.jpg"
}
]

}

теперь я хочу получить все pic ключи внутри массива или списка. результат должен быть: ["1.jpg","4.jpg"]

Ответы [ 4 ]

0 голосов
/ 02 августа 2020

Если вам нужен список изображений в узле продуктов, вы можете получить весь JSON в JSONObject и перебрать внутренний JSONArray

String str = "{\n" +
        "\"pic\":\"1.jpg\",\n" +
        "\"products\":[\n" +
        "{\n" +
        "\"id\":1,\n" +
        "\"pic\":\"4.jpg\"\n" +
        "}\n" +
        "]\n" +
        "\n" +
        "}";

ArrayList<String> list = new ArrayList<>();

try {
    JSONObject root = new JSONObject(str);
    JSONArray products = root.getJSONArray("products");

    for (int i = 0; i <= products.length(); i++) {
        String value = ((JSONObject) products.get(i)).getString("pic");
        list.add(value);
    }

} catch (JSONException e) {
    e.printStackTrace();
}

Log.d(TAG, "onCreate: " + list);
0 голосов
/ 02 августа 2020

В библиотеке Джексона есть простое решение.

String value = "{\"pic\":\"1.jpg\",\"products\":[{\"id\":1,\"pic\":\"4.jpg\"}]}";
JsonNode jsonNode = new  ObjectMapper().readTree(value);
System.out.println(jsonNode.findValuesAsText("pic"));

Вы можете добавить Джексона, используя следующую зависимость maven.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.1</version>
</dependency>

Вы также можете передать файл, входной поток в readTree ().

0 голосов
/ 02 августа 2020

Было бы лучше, если вы проанализируете json на класс POJO. Вы можете использовать Gson для преобразования строки json в объект класса данных ниже.

String jsonString = "you json string here"
Data object = Gson().fromJson(jsonString, Data.class)

Теперь у вас есть объект и вы можете получить список продуктов, из которого вы можете выполнять итерацию и получать значения «pi c».

Ниже класс

package com.example;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Data {

@SerializedName("pic")
@Expose
private String pic;
@SerializedName("products")
@Expose
private List<Product> products = null;

public String getPic() {
return pic;
}

public void setPic(String pic) {
this.pic = pic;
}

public List<Product> getProducts() {
return products;
}

public void setProducts(List<Product> products) {
this.products = products;
}

}
-----------------------------------com.example.Product.java-----------------------------------

package com.example;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Product {

@SerializedName("id")
@Expose
private int id;
@SerializedName("pic")
@Expose
private String pic;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getPic() {
return pic;
}

public void setPic(String pic) {
this.pic = pic;
}

}
0 голосов
/ 02 августа 2020

Пожалуйста, попробуйте этот код:

    //define a list which will contain pic names
    List<String> picList = new ArrayList<>();
    try {
        //jsonMap: your json object variable name
        String picName = (String) jsonMap.get("pic");
        picList.add(picName);
    
        List<Map<String, Object>> products = (List<Map<String, Object>>) jsonMap.get("products");
        for (Map<String, Object> product : products) {
            String pic = (String) product.get("pic");
            picList.add(pic);
        }
    
        System.out.println("=====List of pics===="+picList);
    } catch (Exception e) {
    
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...