1

I have a jsonArray with a bunch of jsonObjects that I'd like to group via the market_id such that objects with similar market_id's are held separately in their own list or array. How can i achieve this?

[
{
    "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",
},

]

In order to achieve something like this:

[{
    "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",
},]
4
  • i think you should check id first according to that you make json array with similar id Commented Apr 11, 2017 at 8:59
  • What have you tried so far? Show your code. Commented Apr 11, 2017 at 9:16
  • @Bmbariah If you group by market_id what about your product_id. Looks your product_id in JSON is different for each market_id. Commented Apr 11, 2017 at 10:00
  • @NikhilSharma Thanks.. Your suggestion works. I think I was looking for something along the lines of Comparators or Collections and overlooked the basics Commented Apr 11, 2017 at 10:06

2 Answers 2

1

First create a Product model class that implements Comparator interface so allows you to sort ProductList, in this case by 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;
}
}

Second, create a Product parser class that parses your product list JSONArray to Product type list and from Product type list to grouped 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;
}
}

Finally, in your activity or wherever you need to implement this feature, use provided 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);
}
}
Sign up to request clarification or add additional context in comments.

Comments

0

I ended up simply looping through every object in the jsonArray and adding objects that share similar market_id's into their own jsonArray. It's not pretty but it works.

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

3 Comments

Wait a minute, I will provide you an elegant solution
Thanks ! Let me test.
Let me know if it works, I have tested and seems that works perfectly

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.