实训日记【3】 数据准备 java处理json

本文介绍了一种复杂JSON数据的解析方法,详细分析了如何处理包含嵌套数组和字典的JSON数据,并提供了具体的Java代码示例。

负责爬虫模块的同学丢给了我这样的一些json数据,从中取两条放在这里。

[{
        "caiming": "藜麦鸡肉丸",
        "chengpin": "http://s1.st.meishij.net/r/178/85/5833928/s5833928_151843048575508.jpg",
        "biaoqian": ["清热解毒", "美容养颜", "延年益寿", "抵抗力", "降糖", "保护视力", "助消化", "养肾", "消食"],
        "gongyi": "蒸",
        "kouwei": "咸鲜味",
        "nandu": "初级入门",
        "renshu": "未知",
        "zhunbeishijian": "60分钟",
        "pengrenshijian": "<30分钟",
        "zhuliao": {
            "鸡蛋清": "35克",
            "胡萝卜": "20克",
            "鸡肉": "100克",
            "淀粉": "15克",
            "三色藜麦": "10克"
        },
        "fuliao": {
            "香菇虾皮粉": "2克",
            "香葱": "6克"
        },
        "guocheng": {
            "1": ["参考月龄:12个月以上,对食材不过敏的宝宝", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843079008009.jpg"],
            "2": ["1. 三色藜麦倒入碗中,加入清水,浸泡2个小时,藜麦是复合淀粉高膳食纤维食物,煮之前需要较长时间吸足水份才容易变软。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843083766525.jpg"],
            "3": [" 浸泡好的藜麦倒入锅中,煮15分钟。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843085640683.jpg"],
            "4": [" 稍晾凉,过滤掉水分。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843088125481.jpg"],
            "5": [" 香葱切成末。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843089792645.jpg"],
            "6": ["胡萝卜洗净削皮,切成小丁。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843091952558.jpg"],
            "7": ["鸡胸肉去掉表面白色的筋膜,洗净切成小丁。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843093628392.jpg"],
            "8": ["切好的鸡胸肉丁,倒入料理机中,加入胡萝卜丁,倒入提前准备好的蛋清。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843121331477.jpg"],
            "9": [" 搅打成细腻的胡萝卜鸡肉泥, 给宝宝做丸子的时候,最好要多搅拌两次,或者搅拌的时间长一些,让肉馅更细腻一些。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843124570656.gif"],
            "10": ["搅打细腻的肉馅倒入碗中,倒入淀粉和香菇虾皮粉。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843127297042.jpg"],
            "11": ["加入香葱和煮好的三色藜麦,用筷子搅拌均匀。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843129682707.gif"],
            "12": ["加入少许的油。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843132038059.jpg"],
            "13": ["接着把调好的鸡肉泥放入裱花袋中,裱花袋也可以用厚一点的保鲜袋代替,剪开一个手指那么大的口子。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843132935327.jpg"],
            "14": ["锅中倒上水,烧开后转小火让水呈微沸的状态,鸡肉泥挤在小勺里后再放入锅中。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843135040926.gif"],
            "15": ["依次挤入小丸子,继续煮5分钟,轻轻搅动,至小丸子全部浮起 。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843137018103.gif"],
            "16": [". 煮好盛出,放入保鲜盒中密封,冰箱冷藏可以保存3天左右,冷冻可以保存7天左右。", "http://s1.st.meishij.net/rs/178/85/5833928/n5833928_151843138719725.jpg"]
        }
    },
    {
        "caiming": "清蒸豆豉石斑鱼",
        "chengpin": "http://s1.st.meishij.net/r/68/166/12416568/s12416568_151764937493567.jpg",
        "biaoqian": ["散瘀止痛", "开胃"],
        "gongyi": "蒸",
        "kouwei": "家常味",
        "nandu": "",
        "renshu": "",
        "zhunbeishijian": "",
        "pengrenshijian": "<30分钟",
        "zhuliao": {
            "石斑鱼": "一条"
        },
        "fuliao": {
            "豆豉": "适量",
            "": "适量",
            "老姜": "适量",
            "料酒": "适量",
            "酱油": "适量",
            "芡粉": "少量",
            "食盐": "少量",
            "花椒": "少量"
        },
        "guocheng": {
            "1": ["1石斑鱼洗净,剪去锋利的鱼鳍,去鳞去腮去内脏,鱼背上横划几刀,少许料酒、少许食盐,加适量葱段、老姜、花椒几颗腌制15分钟,鱼肚子里也要放姜葱。", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937426090.jpg"],
            "2": ["2腌鱼等待时,先调汁备用:蒸鱼酱油+姜+葱+芡粉+冷开水", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937693307.jpg"],
            "3": ["3锅内入水,烧开后,鱼下锅,偏大火蒸10分钟后,快递倒掉盘中多余的蒸汽水汁", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937756041.jpg"],
            "4": ["4淋入酱油汤汁和豆豉,大火再蒸5分钟(备注:豆豉准备好,若买的是无油的生豆豉,建议可加些油先下锅炒一下。)", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937864325.jpg"],
            "5": ["5关火,放葱丝,起锅", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937987694.jpg"],
            "6": ["6上桌", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764938022106.jpg"]
        }
    }]

分析

可以看到里面的属性其实还是挺复杂的,不过我们理清楚里面的关系,取出想要的数据还是非常方便的。
一共有菜名、成品、标签(数组)、工艺、口味、难度、人数、准备时间、烹饪时间、主料(字典)、辅料(字典)、过程(字典,其中value为数组)这些属性,其中是数组或者字典的已经在小括号里面标注出来了。

Maven相关安装

在pom.xml里面的dependencies标签下,加入

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>

标签分析与处理

1.无嵌套数组及字典的key value类型

那么对于一般的key value类型的数据,如菜名,处理起来非常方便。在将json放入JSONObject中后,调用get(“字段名”)即可。
例如System.out.println("[" + i + "]name=" + jsonObject.get("caiming"));

2.字典类型

使用遍历器iterator
如对fuliao

           JSONObject fuliaoarr = (JSONObject) jsonObject.get("fuliao");
            Iterator iterator = fuliaoarr.keys();
            while(iterator.hasNext()){
                String key = (String) iterator.next();
                String value = fuliaoarr.getString(key);
                System.out.println("key: "+key+"value: "+value);
            }

即可。

3.字典嵌套数组类型
        "guocheng": {
            "1": ["1石斑鱼洗净,剪去锋利的鱼鳍,去鳞去腮去内脏,鱼背上横划几刀,少许料酒、少许食盐,加适量葱段、老姜、花椒几颗腌制15分钟,鱼肚子里也要放姜葱。", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937426090.jpg"],
            "2": ["2腌鱼等待时,先调汁备用:蒸鱼酱油+姜+葱+芡粉+冷开水", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937693307.jpg"],
            "3": ["3锅内入水,烧开后,鱼下锅,偏大火蒸10分钟后,快递倒掉盘中多余的蒸汽水汁", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937756041.jpg"],
            "4": ["4淋入酱油汤汁和豆豉,大火再蒸5分钟(备注:豆豉准备好,若买的是无油的生豆豉,建议可加些油先下锅炒一下。)", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937864325.jpg"],
            "5": ["5关火,放葱丝,起锅", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764937987694.jpg"],
            "6": ["6上桌", "http://s1.st.meishij.net/rs/68/166/12416568/n12416568_151764938022106.jpg"]
        }

这个是步骤序号:[步骤内容,步骤图片]是比较复杂的了,但是我们不要急,一层一层将其剥开即可。
1)首先使用iterator获得字典的所有key
JSONObject guochengarr = (JSONObject) jsonObject.get("guocheng");
2)随后遍历每一个步骤,将key的内容转为一个JSONArray对象


while(iterator.hasNext()){
                String key = (String) iterator.next();
                JSONArray json = JSONArray.fromObject(fuliaoarr.getString(key));
                ...
            }

3)遍历数组内容,附上全代码

JSONObject guochengarr = (JSONObject) jsonObject.get("guocheng");
while(iterator.hasNext()){
                String key = (String) iterator.next();
                JSONArray json = JSONArray.fromObject(fuliaoarr.getString(key));
                if(json.size()>0){
                    for(int j=0;j<json.size();j++){
                        String content = (String) json.get(j);  // 遍历 jsonarray 数组,把每一个对象转成 json 对象
                        System.out.println(content);  // 得到 每个对象中的属性值
                    }
                }
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值