我有一个带有一堆jsonObjects的jsonArray,我想通过market_id进行分组,以便具有类似market_id的对象分别保存在它们自己的列表或数组中。我怎样才能做到这一点?
[
{
"product_id": "12301",
"selection": "No",
"sales": "31",
"market_id": "10",
},
{
"product_id": "12302",
"selection": "No",
"sales": "24",
"market_id": "43",
},
{
"product_id": "12303",
"selection": "Yes",
"sales": "121",
"market_id": "10",
},
{
"product_id": "12304",
"selection": "No",
"sales": "0",
"market_id": "43",
},
{
"product_id": "12305",
"selection": "Yes",
"sales": "20",
"market_id": "43",
},
为了实现这样的目标:
[{
"product_id": "12304",
"selection": "No",
"sales": "0",
"market_id": "43",
},
{
"product_id": "12305",
"selection": "Yes",
"sales": "20",
"market_id": "43",
},
{
"product_id": "12302",
"selection": "No",
"sales": "24",
"market_id": "43",
},]
答案 0 :(得分:1)
首先创建一个实现Comparator接口的Product模型类,这样就可以对ProductList进行排序,在本例中是 marketId 。
<强> Product.java 强>
public class Product implements Comparator<Product> {
public String productId;
public String selection;
public String sales;
public String marketId;
public Product() {
super();
}
@Override
public int compare(final Product p1, final Product p2) {
if (!TextUtils.isEmpty(p1.marketId) && !TextUtils.isEmpty(p2.marketId)) {
return p1.marketId.compareTo(p2.marketId); //Ascending order
}
return 0;
}
}
其次,创建一个Product解析器类,将产品列表JSONArray解析为Product type列表,并从Product type list解析为Product JSONArray。
<强> ProductParser.java 强>
public class ProductParser {
private static final String TAG = ProductParser.class.getSimpleName();
private static final String PRODUCT_ID = "product_id";
private static final String SELECTION = "selection";
private static final String SALES = "sales";
private static final String MARKET_ID = "market_id";
private static final String HELPER_ID = "-1";
public ProductParser() {
super();
}
public List<Product> parseProductArrayToProductList(final JSONArray productArray) {
final List<Product> productsList = new ArrayList<>();
if (null != productArray) {
try {
final int productCount = productArray.length();
for (int i = 0; i < productCount; ++i) {
final JSONObject productJson = productArray.getJSONObject(i);
final Product product = new Product();
product.productId = productJson.getString(PRODUCT_ID);
product.selection = productJson.getString(SELECTION);
product.sales = productJson.getString(SALES);
product.marketId = productJson.getString(MARKET_ID);
productsList.add(product);
}
} catch (final JSONException e) {
Log.e(TAG, e.toString());
}
}
return productsList;
}
public JSONArray parseProductListToGroupedProductArray(final List<Product> productList) {
final JSONArray groupedProductArray = new JSONArray();
if (null != productList && !productList.isEmpty()) {
final int productCount = productList.size();
String currentMarketId = HELPER_ID;
JSONArray productArray = null;
for (int i = 0; i < productCount; ++i) {
final Product product = productList.get(i);
if (null != product) {
if (!currentMarketId.equals(product.marketId)) {
currentMarketId = product.marketId;
if (null != productArray) {
groupedProductArray.put(productArray);
}
productArray = new JSONArray();
}
try {
final JSONObject productObject = new JSONObject();
productObject.put(PRODUCT_ID, product.productId);
productObject.put(SELECTION, product.selection);
productObject.put(SALES, product.sales);
productObject.put(MARKET_ID, product.marketId);
productArray.put(productObject);
} catch (final JSONException e) {
Log.e(TAG, e.toString());
}
}
}
if (null != productArray) {
groupedProductArray.put(productArray);
}
}
return groupedProductArray;
}
}
最后,在您的活动中或您需要实现此功能的任何地方,请使用提供的clases。
<强> MainActivity.java 强>
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String data = "\r\n\r\n[\r\n {\r\n \"product_id\": \"12301\",\r\n \"selection\": \"No\",\r\n \"sales\": \"31\",\r\n \"market_id\": \"10\"\r\n },\r\n {\r\n \"product_id\": \"12302\",\r\n \"selection\": \"No\",\r\n \"sales\": \"24\",\r\n \"market_id\": \"43\"\r\n },\r\n {\r\n \"product_id\": \"12303\",\r\n \"selection\": \"Yes\",\r\n \"sales\": \"121\",\r\n \"market_id\": \"10\"\r\n },\r\n {\r\n \"product_id\": \"12304\",\r\n \"selection\": \"No\",\r\n \"sales\": \"0\",\r\n \"market_id\": \"43\"\r\n },\r\n {\r\n \"product_id\": \"12305\",\r\n \"selection\": \"Yes\",\r\n \"sales\": \"20\",\r\n \"market_id\": \"43\"\r\n }\r\n]\r\n\r\n";
final List<Product> productList = getProductList(data);
Collections.sort(productList, new Product());
final JSONArray sortedProductArray = getProductArray(productList);
Log.e(TAG, sortedProductArray.toString()); // Here you have!
}
private List<Product> getProductList(final String data) {
List<Product> productList = new ArrayList<>();
try {
final JSONArray productArray = new JSONArray(data);
final ProductParser parser = new ProductParser();
productList = parser.parseProductArrayToProductList(productArray);
} catch (final JSONException e) {
Log.e(TAG, e.toString());
}
return productList;
}
private JSONArray getProductArray(final List<Product> productList) {
final ProductParser parser = new ProductParser();
return parser.parseProductListToGroupedProductArray(productList);
}
}
答案 1 :(得分:0)
我最终简单地循环遍历jsonArray中的每个对象,并将共享类似market_id的对象添加到他们自己的jsonArray中。它不漂亮,但它有效。
try {
JSONArray jsonArray = new JSONArray(mainjson);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String market_id = jsonObject.getString("market_id");
if (market_id.equalsIgnoreCase("43")) {
JSONObject json = new JSONObject();
json.put("match_id", jsonObject.getString("product_id"));
json.put("selection", jsonObject.getString("selection"));
json.put("sales", jsonObject.getString("sales"));
json.put("market_id", jsonObject.getString("market_id"));
new_json.put(json);
} else if (market_id.equalsIgnoreCase("10")) {
....