如何从多个json对象中获取数据

Posted

技术标签:

【中文标题】如何从多个json对象中获取数据【英文标题】:How to get data from multiple json object 【发布时间】:2020-05-05 21:23:34 【问题描述】:

我知道如何从普通的 json 数据中获取数据,但最近我遇到了这个新问题,其中 json 看起来像

 "product_1": 
"productId": "product_1",
"customerId": "customer_1",
"brandCode": "BRD0050",
"brandName": "ABC.ST.",
"productCode": 700251,
"productDesc": "ABC  AB 50gm Sac",
"mrp": 15,
"expiry": 1608461977
,
"product_2": 
"productId": "product_2",
"customerId": "customer_1",
"brandCode": "BRD0050",
"brandName": "ABC.ST.",
"productCode": 700251,
"productDesc": "ABC  AB 50gm Sac",
"mrp": 17,
"expiry": 1608462037
,
"product_3": 
"productId": "product_3",
"customerId": "customer_1",
"brandCode": "BRD0050",
"brandName": "ABC.ST.",
"productCode": 700251,
"productDesc": "ABC  AB 50gm Sac",
"mrp": 17,
"expiry": 1608461978
...

持续到 product_150

所以我在谷歌上找了很长一段时间,但没有得到任何价值 这是我尝试过的

    try 
        JSONObject obj = new JSONObject(loadJSONFromAsset());
        //    JSONArray m_jArry = obj.getJSONArray("product_" + j);
        Iterator<String> keyIterator = obj.keys();
        Log.e("Details",""+obj.keys().hasNext());
        while(keyIterator.hasNext()) 
            String productKey = keyIterator.next();

            JSONObject jo_inside = obj.getJSONObject(productKey);


            ArrayList<HashMap<String, String>> formList = new ArrayList<HashMap<String, String>>();
            HashMap<String, String> m_li;

           /* for (int i = 0; i < jo_inside.length(); i++) 
                Log.e("Details",""+jo_inside.length());
                Log.e("Details-->", jo_inside.getString("productId"));
                String formula_value = jo_inside.getString("formule");
                String url_value = jo_inside.getString("url");

                //Add your values in your `ArrayList` as below:
                m_li = new HashMap<String, String>();
                m_li.put("formule", formula_value);
                m_li.put("url", url_value);

                formList.add(m_li);


            

            */
        
     catch (JSONException e) 
        e.printStackTrace();
    

我从资产文件中获取数据的位置。我只尝试在 Log 中获取数据,任何线索我做错了什么或我的方法应该是什么?目前,我做了一个 for 循环直到 150 并获取这样的数据。

【问题讨论】:

您可以简单地使用 GSON 或其他库来获得更好的结果,而不是使用迭代该 json 字符串来解析您的 json,看看这个:tutorialspoint.com/gson/index.htm 我对 json 数据出现问题的任何方法都没有问题,例如 product_1 ...product_150 @javadroid 【参考方案1】:

我猜obj.getJSONArray 没有返回任何内容,因为 JSON 没有被标记为数组。删除您的外部 for 循环,然后使用 obj.keys() 它应该在您的 json 对象的顶层为您提供一个键数组,根据您提供的示例将是 ["product_1", "product_2", "product_3" ],然后你可以遍历该数组来获取每个生产对象,例如;

Iterator<String> keyIterator = obj.keys();
while(keyIterator.hasNext()) 

    String productKey = keyIterator.next();
    JSONObject jo_inside = obj.getJSONObject(productKey);

    ... rest of your inner for loop here ...

【讨论】:

如何从 obj.size() 中获取大小而不是数组或列表? 是的,你是对的,我编辑了我的答案以使用迭代器,但重点是,你的 JSON 中没有任何数组,所以你需要获取 Keys 列表在顶层,并为每个顶层键抓取对象以获取您的数据。 先生,我试图做的是生成密钥,但我想我错了 如果您假设密钥始终采用“product_”+ [某个数字]的格式,您可能已经能够通过自己生成密钥来实现它,但是对于这些键中的每一个,你仍然想直接跳到调用obj.getJSONObject(somekey),因为你的JSON中没有数组可以通过调用getJSONArray来检索。 循环内部某处是否发生异常?这将阻止它进入下一次迭代。也许尝试将 while 循环中的所有内容都包装在 try..catch 中,以确保内部异常不会破坏循环?

以上是关于如何从多个json对象中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JSON 数组中的 JSON 对象中的单个值获取数据?

我如何从多个标签中获取多个数据,并将它们作为 json 存储在 javascript、jquery 中

数据表中的多选行,如何从JSON获取一列数据到php

如何在可缩放滚动视图中绘制可点击的网格对象,从远程 json 数据中获取数据?

如何从片段中的 JSON 响应中的对象获取数据

如何使用异步任务保存多个 JSON 数据对象