在jsonArray Android中对jsonObjects进行分组

时间:2017-04-11 08:54:46

标签: android arrays json sorting

我有一个带有一堆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",
},]

2 个答案:

答案 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")) {
              ....