如何提取与 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。
我有一个移动库存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。