如何提取与 JSON 数组中特定键相关的信息?

How to extract information related a particular key inside a JSON Array?

我有一个移动库存json,其中包含卖家信息和可用型号,如下所示

{
    "title": "mobile_stock_information",
    "payload": {
        "sellers": [
            {
                "seller": "SAMSUNG",
                "phone_model": "Samsung S21"
            },
            {
                "seller": "SAMSUNG",
                "phone_model": "Samsung S21 Ultra"
            },
            {
                "seller": "SAMSUNG",
                "phone_model": "Samsung S22"
            },
            {
                "seller": "SAMSUNG",
                "phone_model": "Samsung S22 Ultra"
            },
            {
                "seller": "APPLE",
                "phone_model": "Iphone 13"
            },
            {
                "seller": "APPLE",
                "phone_model": "Iphone 13 Pro"
            },
            {
                "seller": "APPLE",
                "phone_model": "Iphone 12"
            },
            {
                "seller": "GOOGLE",
                "phone_model": "Pixel 6"
            },
            {
                "seller": "GOOGLE",
                "phone_model": "Pixel 6 XL"
            },
            {
                "seller": "GOOGLE",
                "phone_model": "Pixel 5"
            }
        ]
    }
}

我正在使用 Jayway JSON 从 Json 中提取所有卖家,如下所示

String sellerPath = "$.payload.sellers[*].seller";

DocumentContext jsonContext = JsonPath.parse(seller_json);

List<String> sellersList = jsonContext.read(sellerPath);

Set<String> sellerSet = new HashSet<>(sellersList);

我正在将 List 转换为 Set 以获得独特的卖家,之后我正在遍历 JSONArray 并尝试提取移动卖家特定数据

sellersArray = sellerJSON.getJSONArray("sellers");

public static JSONObject getSellerObject(String sellerToSearch, JSONArray array) {
    for(int i = 0; i < array.length(); i++) {
        try {
            JSONObject jsonObject = array.getJSONObject(i);
            if (jsonObject.getString("seller").equals(sellerToSearch)){
                return jsonObject;
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    return null;
}

输出如下所示

{
    "title": "mobile_stock_information",
    "payload": {
        "sellers": [
            {
                "seller": "SAMSUNG",
                "phone_model": "Samsung S21"
            },
            {
                "seller": "SAMSUNG",
                "phone_model": "Samsung S21 Ultra"
            },
            {
                "seller": "SAMSUNG",
                "phone_model": "Samsung S22"
            },
            {
                "seller": "SAMSUNG",
                "phone_model": "Samsung S22 Ultra"
            }
        ]
    }
}

假设我有 5 个不同的供应商和卖家数组中的 10 个 json 对象,我必须为每个键迭代循环 10 次,对于 5 个键,它将是 50 次。是否有任何有效的方法来减少迭代次数并提取供应商特定信息。提前致谢。

您可以在 JSON 的一次传递中创建 seller/vendor 及其模型的地图。您需要做的就是组成一个 Map<String, List<String>> ,其中键是卖家,值是他们拥有的型号列表。然后您可以检索任何特定卖家的模型列表,而无需遍历 JSON.

JSONArray sellersArray = sellerJSON.getJSONArray("sellers");
Map<String,List<String>> sellerModels = new HashMap<>();
for (int i = 0; i < sellersArray.length(); i++) {
  JSONObject modelObj = sellersArray.getJSONObject(i);
  String seller = modelObj.getString("seller");
  String model = modelObj.getString("phone_model");
  List<String> models = sellerModels.get(seller);
  if (models == null) {
    models = new ArrayList<>();
    sellerModels.put(seller, models);
  }
  models.add(model);
}

从这一点开始,您可以查询 sellerModels 任何特定卖家,并获得其型号列表,而无需再次迭代 JSON。