9
回答
对复杂Json解析(Java)
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   
{
    "productPrice": [
        {
            "priceInfo": [
                {
                    "productid": "77",
                    "webstileid": "2"
                },
                {
                    "productid": "191",
                    "webstileid": "3"
                }
            ]
        },
        {
            "priceRegex": [
                {
                    "webstileid": "2",
                    "tid": "6"
                },
                {
                    "webstileid": "3",
                    "tid": "7"
                }
            ]
        }
    ]

}

利用Java解析

类似这样的json格式,需要取出priceInfo和priceRegex中相同的webstileid,然后取出两个数组的productid和tid

自己做的循环方法速度偏低,在大数据量情况下效果不好,不知道哪位大大有更高效的方式。

举报
夜殇晓梦
发帖于4年前 9回/4K+阅
共有9个答案 最后回答: 4年前
我知道映射,问题是现在我想要的方案,看看有没有比我的方法高效的。不要只说用什么什么的。拿点实际的代码出来看看啊。

private class productPrice

{

    private Map priceInfo;

    private Map priceRegex;

    set......

    get.......

}


如果我没有记错的话,使用FastJson的productPrice obj = productPriceJSON.parseJsonToObject(jsonStr);来做比较快一些。然后

这个obj就是你要的对象了。。。。。Json解析的那个方法我没有查,你用的时候查一下。

--- 共有 2 条评论 ---
Ryan-瑞恩回复 @sxgkwei : 哦。。。我没有查API,不好意思。 4年前 回复
sxgkwei你这个我不相信。。。都没有传入class参数,它怎么知道要构建你强转的对象?不符合逻辑 4年前 回复

如果用来spring mvc 直接用jackson转换下就OK了。

Product product = new ObjectMapper().readValue("{\"skuCode\":\"skuCode\",\"categoryId\":1}", Product.class);

public static String getMapValue(JSONObject json) {
        StringBuilder result = new StringBuilder();
        JSONArray jsonArrayResult = new JSONArray();
        JSONObject jsonObjectResult = new JSONObject();
        JSONArray jsonArray = json.getJSONArray("productPrice");
        //严格规范顺序
        List<PriceInfo> priceInfos = JSONArray.toList(jsonArray.getJSONObject(0).getJSONArray("priceInfo"), PriceInfo.class);
        List<PriceRegex> priceRegexs = JSONArray.toList(jsonArray.getJSONObject(1).getJSONArray("priceRegex"), PriceRegex.class);
        getRegexMap(priceRegexs);
        String price = "";
        Products products = products = new Products();
        for (PriceInfo priceInfo : priceInfos) {
            Products.ProductPrice productPrice = products.getProductPrice();
            productPrice.setProductid(priceInfo.getProductid());
            String html = NetUtil.downloadPage(priceInfo.getProducturl());//?时耗
            String tid = regexMap.get(priceInfo.getWebstileid()).getTid();
            demoModel = getSubClass(tid);
            //System.out.println("regex:"+regex.getPriceLabel()+";pattern:"+regex.getPricePattern());
            price = demoModel.getPrice(regexMap.get(priceInfo.getWebstileid()).getPriceLabel(), html, regexMap.get(priceInfo.getWebstileid()).getPricePattern());
            if (price == null || "".equals(price)) {//第一次赋值价格为空的时候才启用图片价格
                price = demoModel.getPrice(regexMap.get(priceInfo.getWebstileid()).getPriceimgLabel(), html, regexMap.get(priceInfo.getWebstileid()).getPricePattern());
                productPrice.setPriceimgLabel(price);
            } else {
                productPrice.setPriceimgLabel(price);
            }
            jsonArrayResult.element(productPrice);
        }
        jsonObjectResult.put("ProductPrice", jsonArrayResult);
        result.append(jsonObjectResult);
        return result.toString();
    }

    private static void getRegexMap(List<PriceRegex> priceRegexs) {
        for (PriceRegex priceRegex : priceRegexs) {
            regexMap.put(priceRegex.getWebstileid(), priceRegex);
        }
    }
 
这是目前的方法。把处于较少的循环单独出来。目前该方法的耗时可能都出在标明了注释为时耗的地方。不知道大大们有其他方法吗
顶部