对复杂Json解析(Java)

夜殇晓梦 发布于 2013/12/25 14:02
阅读 4K+
收藏 3
{
    "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

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

加载中
0
Timco
Timco
复杂吗。。用fastjson吧
0
Fe-Fe
Fe-Fe
这个貌似不复杂吧,用一个javabean映射  fastjson  或者jackson都可以解决!
0
夜殇晓梦
我知道映射,问题是现在我想要的方案,看看有没有比我的方法高效的。不要只说用什么什么的。拿点实际的代码出来看看啊。
0
linan
linan
把你循环的方法贴出来,看看能优化不。 
0
Ryan-瑞恩
Ryan-瑞恩

private class productPrice

{

    private Map priceInfo;

    private Map priceRegex;

    set......

    get.......

}


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

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

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

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

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

0
CapJes
CapJes
使用google gson吧,性能感觉挺不错。
0
夜殇晓梦
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);
        }
    }
 
这是目前的方法。把处于较少的循环单独出来。目前该方法的耗时可能都出在标明了注释为时耗的地方。不知道大大们有其他方法吗
返回顶部
顶部