精华内容
下载资源
问答
  • 有的甚至会比这个更长,看起来特别不舒服,而且假如原始的数据发生了一个变化,你需要针对你的代码再做一个工作量不小的适配工作,非常不方便,所以我想能否可以快速的对一串json数据取到想要的key对应的value值呢?...

    前言

    之前在实际的项目研发中,需要对一些复杂的json数据进行取值操作,由于json数据的层级很深,所以经常取值的代码会变成类似这样:

    value = data['store']['book'][0]['title']
    

    有的甚至会比这个更长,看起来特别不舒服,而且假如原始的数据发生了一个变化,你需要针对你的代码再做一个工作量不小的适配工作,非常不方便,所以我想能否可以快速的对一串json数据取到想要的key对应的value值呢?

    经过一段尝试,终于成功的解决了这个问题,其实核心思想就是将取值过程流程化,代码其实很简单,我也已经将代码传到了github上了,地址在这里

    安装

    为了更加能够让大家快速的使用代码的相关功能,我将代码上传到python库。

    大家可以使用pip进行安装:

    pip install jsonsearch
    

    或者使用

    pip install --index-url https://pypi.org/simple/jsonsearch
    

    解决方案

    测试数据

    {
        "store": {
            "book": [
                {
                    "category": "reference",
                    "author": "Nigel Rees",
                    "title": "Sayings of the Century",
                    "price": 8.95
                },
                {       
                    "category": "fiction",
                    "author": "Evelyn Waugh",
                    "title": "Sword of Honour",
                    "price": 12.99
                },      
                {       
                    "category": "fiction", 
                    "author": "Herman Melville",
                    "title": "Moby Dick",
                    "isbn": "0-553-21311-3",
                    "price": 8.99
                },
                {   
                    "category": "fiction",
                    "author": "J. R. R. Tolkien",
                    "title": "The Lord of the Rings",
                    "isbn": "0-395-19395-8",
                    "price": 22.99
                }
            ],
            "bicycle": {
                "color": "red",
                "price": 19.95
            }
        },
        "expensive": 10
    }
    

    功能介绍

    当前程序主要有以下几个功能:

    • 查找key对应的所有值,比如查找上述数据中title对应的所有值
    • 查找key对应值的所有路径,比如取到title对应的值经过的所有路径
    • 查找key对应的第一个值,比如查找上述数据中title对应的第一个值
    • 查找key对应值的第一条路径,比如取到title对应的值经过的第一条路径

    正式使用

    准备工作

    1. 导入jsonsearch包
    from jsonsearch import JsonSearch
    
    1. 数据初始化

    如果你导入的数据本来就是json对象,那么采用如下的方式导入:

    jsondata = JsonSearch(object=test_data, mode='j')
    

    如果你导入的数据是字符类型对象,那么采用如下的方式导入:

    jsondata = JsonSearch(object=test_data, mode='s')
    

    其中的区别在于mode选项的值填写的不一样,其中j表示json对象,mode表示字符对象。

    功能使用

    1. 查找key对应的所有值

    如果我们希望从案例数据中查找title对应的所有值,只需使用下面程序即可

    jsondata.search_all_value(key='title')
    

    得到的结果如下:

    ['Sayings of the Century', 'Sword of Honour', 'Moby Dick', 'The Lord of the Rings']
    

    2. 查找key对应值的所有路径

    如果我们希望从案例数据中查找title对应值的所有路径,只需使用下面程序即可

    jsondata.search_all_path(key='title')   
    

    得到的结果如下:

    [['store', 'book', 0, 'title'], ['store', 'book', 1, 'title'], ['store', 'book', 2, 'title'], ['store', 'book', 3, 'title']]
    

    如果我们对路径进行遍历其实也能取到我们的值。

    3. 查找key对应的第一个值

    如果我们希望从案例数据中查找title对应的第一个值,只需使用下面程序即可

    jsondata.search_first_value(key='title')      
    

    得到的结果如下:

    'Sayings of the Century'
    

    4. 查找key对应值的第一条路径

    如果我们希望从案例数据中查找title对应值的第一条路径,只需使用下面程序即可

    jsondata.search_first_path(key='title')
    

    得到的结果如下:

    ['store', 'book', 0, 'title']
    

    结语

    以上就是当前jsonsearch的主要功能,后续的话会继续为其完善一些相应的功能,如果大家有需求的话,也欢迎在github上提issue,欢迎大家下载使用jsonsearch

    如果对你有帮助的话,欢迎在github上点击一个star,非常感谢。

    在这里插入图片描述

    展开全文
  • * 方法二:不直接转实体类,通过层层提取节点提取数据 github详细测试项目地址: https://github.com/Yellow213/ConvenienceTools * @方法一:通过解析json,并转存进去实体类 * 优点:自动解析,方便快捷,且...

    目录

     

    github测试项目地址:

    * @方法一:通过解析json,并转存进去实体类

     * 方法二:不直接转实体类,通过层层提取节点提取数据


    github详细测试项目地址:

    https://github.com/Yellow213/ConvenienceTools

     

    * @方法一:通过解析json,并转存进去实体类


     * 优点:自动解析,方便快捷,且维护性较好。
     * 缺点:那种方法是将所有的东西都要解析出来,其实好几个类压根没用用的,也就是说那几个类其实是垃圾类,但是如果不写,那么就会报错。

    上代码:

    import com.dist.model.*;
    import net.sf.json.JSONObject;
    import net.sf.json.JsonConfig;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.JUnit4;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Objects;
    
    /**
     * @author hh
     * @date 2019/02/28
     * @方法一:通过解析json,并转存进去实体类
     * 优点:自动解析,方便快捷,且维护性较好。
     * 缺点:那种方法是将所有的东西都要解析出来,其实好几个类压根没用用的,也就是说那几个类其实是垃圾类,但是如果不写,那么就会报错。
     */
    @RunWith(JUnit4.class)
    public class DriverTestClass {
        @Test
        public void test01()throws Exception{
        	//(1)当获取到一条信息的时候,通过层层的解析,获得json数据
            String str ="{\"orderCode\":\"346\",\"userName\":\"136\",\"customerName\":\"小明\",\"provinceCode\":\"190\",\"cityCode\":\"000\",\"districtCode\":\"000\",\"customerAddress\":\"广东省广州市\",\"mobNum\":\"136\",\"orderSaleTime\":\"2019-02-01 23:04:26\",\"evaluationMark\":\"0\",\"invoiceHead\":\"小明\",\"orderTotalStatus\":\"30\",\"provinceName\":\"广东省\",\"cityName\":\"广州市\",\"districtName\":\"xX区\",\"sellerOrdRemark\":\"E3\",\"buyerOrdRemark\":\"\",\"invoiceType\":\"02\",\"invoice\":\"\",\"vatTaxpayerNumber\":\"\",\"registerAddress\":\"\",\"registerPhone\":\"\",\"bank\":\"\",\"account\":\"\",\"invoiceRecipientAddress\":\"\",\"invoiceRecipientName\":\"\",\"invoiceRecipientPhone\":\"\",\"invoiceRecipientHandPhone\":\"\",\"payType\":\"\",\"payTotalAmount\":\"\",\"needinvoiceflag\":\"Y\",\"isCanModifyTransportFee\":\"N\",\"guideAccountNo\":\"\",\"orderTime\":\"2019-02-01 23:02:53\",\"colorMarkFlags\":\"2\",\"phoneNum\":\"\",\"zipCode\":\"\",\"deliveryArea\":\"0200499\",\"detailAddress\":\"世外桃源\",\"countMoney\":\"490.00000\",\"sumDonationAmt\":\"0.00\",\"orderDetail\":[{\"productCode\":\"10668919671\",\"productName\":\"周生�?(CHOW SANG SANG)时尚黄金K金链18K金项�? 百搭素链 04800N18KY定价 40厘米\",\"unitPrice\":\"530.00000\",\"payAmount\":\"490.00000\",\"saleNum\":\"1.00000\",\"orderLineStatus\":\"30\",\"transportFee\":\"0.00000\",\"returnOrderFlag\":\"0\",\"coupontotalMoney\":\"40.00000\",\"vouchertotalMoney\":\"\",\"invCode\":\"\",\"orderLineNumber\":\"00662135679001\",\"itemCode\":\"04800N18KY-FJ-40-\",\"receivezipCode\":\"\",\"hwgFlag\":\"\",\"disType\":\"\",\"orderchannel\":\"MOBILE|01|01|7.4.2|20000\",\"prmtcode\":\"\",\"bLineNumber\":\"34662678213\",\"expresscompanycode\":\"E01\",\"expressno\":\"1154271476617\",\"phoneIdentifyCode\":\"\",\"payorderid\":\"\",\"packageorderid\":\"\",\"fpsdeliveryflag\":\"0\",\"activitytype\":\"\",\"reservedepositamount\":\"\",\"reservebalanceamount\":\"\",\"reservestatus\":\"\",\"mode\":\"\",\"itemTaxFare\":\"\",\"declareItemPrice\":\"\",\"declareItemTaxfare\":\"\",\"declareGoodsAmount\":\"\",\"carShopSerWay\":\"\",\"carShopCode\":\"\",\"carShopName\":\"\",\"carShopAddr\":\"\",\"carShopTel\":\"\",\"orderPayCode\":\"01\",\"dealPhoto\":\"http://sphss.suning.com/productspan/show.html?key=BkUDE9YNdQ4EkEshUJOTiAnYKNwU171TR5lXpgy%2F8UwpnL3SbTTXgW2LODzhNM7t\",\"isProsupplierDelivery\":\"0\",\"lpgOrderFlag\":\"\",\"serviceItemFlag\":\"0\",\"paymentList\":[{\"paycode\":\"6901\",\"banktypecode\":\"20001\",\"payamount\":\"30.00000\",\"offLinePayFlag\":\"\",\"alipayPayNo\":\"\"},{\"paycode\":\"6901\",\"banktypecode\":\"10006\",\"payamount\":\"10.00000\",\"offLinePayFlag\":\"\",\"alipayPayNo\":\"\"},{\"paycode\":\"6903\",\"banktypecode\":\"\",\"payamount\":\"0.01000\",\"offLinePayFlag\":\"\",\"alipayPayNo\":\"\"},{\"paycode\":\"4148\",\"banktypecode\":\"\",\"payamount\":\"489.99000\",\"offLinePayFlag\":\"\",\"alipayPayNo\":\"\"}],\"couponList\":[{\"coupontype\":\"8012\",\"sharelimit\":\"0.00000\"}],\"orderChannels\":[{\"orderChannelCode\":\"2\"}],\"activityTypes\":[],\"payTypes\":[],\"payerIdNumber\":\"\",\"payerCustomerName\":\"\",\"otoOrderType\":\"\",\"otoStoreCode\":\"\",\"otoStoreName\":\"\",\"expandAmount\":\"\",\"refVerifyCode\":\"\",\"orderServiceTypeMulti\":\"\",\"popContractInfo\":{},\"deliveryTime\":\"2019-02-02 13:33:52\",\"sendType\":\"1\",\"selfDeliveryName\":\"\",\"selfDeliveryMobile\":\"\",\"returnFlag\":\"\",\"complainFlag\":\"0\",\"logisticsOrderId\":\"E018\",\"carService\":{},\"orderTagList\":\"\",\"donationProjectInfo\":{\"donationProjectId\":\"\",\"donationAmt\":\"0.00\"}}]}";
            //(2)解析json数据,并把数据放到map里面
            JSONObject json = JSONObject.fromObject(str);
            Map classMap = new HashMap();
            classMap.put("orderDetail",OrderDetail.class);
            classMap.put("paymentList", Payment.class);
            classMap.put("couponList", Coupon.class);
            classMap.put("orderChannels", OrderChannel.class);
            classMap.put("donationProjectInfo",DonationProjectInfo.class);
            classMap.put("activityTypes", Object.class);
            //(3)这个作用是输出name和class
            JsonConfig config = new JsonConfig();
            config.setIgnoreDefaultExcludes(true);
            //(4)自动转化,塞进去实体类
            OrderGet orderGet = (OrderGet) JSONObject.toBean(json,OrderGet.class,classMap);
            //(5)通过实体类直接可以提取数据。十分方便快捷
            System.out.println("显示json中的数据:"+orderGet.getOrderDetail().get(0).getProductCode());
            System.out.println("显示最外层json中的数据:"+orderGet.getOrderCode()+","+orderGet.getOrderCode());
        }
    }

    输出结果:

    实体类:(根据上边详细对应节点写上即可)

    git地址:https://github.com/Yellow213/ConvenienceTools

     * 方法二:不直接转实体类,通过层层提取节点提取数据


     * 优点:按照需求去提取数据,不需要写多余无关的类,且不容易报错。(提取数据少的时候推荐使用)
     * 缺点:维护性较差,每次提取多一个节点数据,需要人工去写。

    JSONObject obj = JSONObject.fromObject(json);
     System.out.println(obj.getString("orderCode"));

    上代码:

    
    import org.junit.Test;
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    public class DirverTestClass2 {
    
    /**
     * @author hh
     * @date 2019/02/28
     * @方法二:不直接转实体类,通过层层提取节点提取数据
     * 备注:
     * 方法一:那种方法是将所有的东西都要解析出来,其实好几个类压根没用用的,也就是说那几个类其实是垃圾类,但是如果不写,那么就会报错。
     * 方法二:
     * 优点:按照需求去提取数据,不需要写多余无关的类,且不容易报错。(提取数据少的时候推荐使用)
     * 缺点:维护性较差,每次提取多一个节点数据,需要人工去写。
     */
    	@Test
    	public void test() {
            String str ="{\"orderCode\":\"346\",\"userName\":\"136\",\"customerName\":\"小明\",\"provinceCode\":\"190\",\"cityCode\":\"000\",\"districtCode\":\"000\",\"customerAddress\":\"广东省广州市\",\"mobNum\":\"136\",\"orderSaleTime\":\"2019-02-01 23:04:26\",\"evaluationMark\":\"0\",\"invoiceHead\":\"小明\",\"orderTotalStatus\":\"30\",\"provinceName\":\"广东省\",\"cityName\":\"广州市\",\"districtName\":\"xX区\",\"sellerOrdRemark\":\"E3\",\"buyerOrdRemark\":\"\",\"invoiceType\":\"02\",\"invoice\":\"\",\"vatTaxpayerNumber\":\"\",\"registerAddress\":\"\",\"registerPhone\":\"\",\"bank\":\"\",\"account\":\"\",\"invoiceRecipientAddress\":\"\",\"invoiceRecipientName\":\"\",\"invoiceRecipientPhone\":\"\",\"invoiceRecipientHandPhone\":\"\",\"payType\":\"\",\"payTotalAmount\":\"\",\"needinvoiceflag\":\"Y\",\"isCanModifyTransportFee\":\"N\",\"guideAccountNo\":\"\",\"orderTime\":\"2019-02-01 23:02:53\",\"colorMarkFlags\":\"2\",\"phoneNum\":\"\",\"zipCode\":\"\",\"deliveryArea\":\"0200499\",\"detailAddress\":\"世外桃源\",\"countMoney\":\"490.00000\",\"sumDonationAmt\":\"0.00\",\"orderDetail\":[{\"productCode\":\"10668919671\",\"productName\":\"周生�?(CHOW SANG SANG)时尚黄金K金链18K金项�? 百搭素链 04800N18KY定价 40厘米\",\"unitPrice\":\"530.00000\",\"payAmount\":\"490.00000\",\"saleNum\":\"1.00000\",\"orderLineStatus\":\"30\",\"transportFee\":\"0.00000\",\"returnOrderFlag\":\"0\",\"coupontotalMoney\":\"40.00000\",\"vouchertotalMoney\":\"\",\"invCode\":\"\",\"orderLineNumber\":\"00662135679001\",\"itemCode\":\"04800N18KY-FJ-40-\",\"receivezipCode\":\"\",\"hwgFlag\":\"\",\"disType\":\"\",\"orderchannel\":\"MOBILE|01|01|7.4.2|20000\",\"prmtcode\":\"\",\"bLineNumber\":\"34662678213\",\"expresscompanycode\":\"E01\",\"expressno\":\"1154271476617\",\"phoneIdentifyCode\":\"\",\"payorderid\":\"\",\"packageorderid\":\"\",\"fpsdeliveryflag\":\"0\",\"activitytype\":\"\",\"reservedepositamount\":\"\",\"reservebalanceamount\":\"\",\"reservestatus\":\"\",\"mode\":\"\",\"itemTaxFare\":\"\",\"declareItemPrice\":\"\",\"declareItemTaxfare\":\"\",\"declareGoodsAmount\":\"\",\"carShopSerWay\":\"\",\"carShopCode\":\"\",\"carShopName\":\"\",\"carShopAddr\":\"\",\"carShopTel\":\"\",\"orderPayCode\":\"01\",\"dealPhoto\":\"http://sphss.suning.com/productspan/show.html?key=BkUDE9YNdQ4EkEshUJOTiAnYKNwU171TR5lXpgy%2F8UwpnL3SbTTXgW2LODzhNM7t\",\"isProsupplierDelivery\":\"0\",\"lpgOrderFlag\":\"\",\"serviceItemFlag\":\"0\",\"paymentList\":[{\"paycode\":\"6901\",\"banktypecode\":\"20001\",\"payamount\":\"30.00000\",\"offLinePayFlag\":\"\",\"alipayPayNo\":\"\"},{\"paycode\":\"6901\",\"banktypecode\":\"10006\",\"payamount\":\"10.00000\",\"offLinePayFlag\":\"\",\"alipayPayNo\":\"\"},{\"paycode\":\"6903\",\"banktypecode\":\"\",\"payamount\":\"0.01000\",\"offLinePayFlag\":\"\",\"alipayPayNo\":\"\"},{\"paycode\":\"4148\",\"banktypecode\":\"\",\"payamount\":\"489.99000\",\"offLinePayFlag\":\"\",\"alipayPayNo\":\"\"}],\"couponList\":[{\"coupontype\":\"8012\",\"sharelimit\":\"0.00000\"}],\"orderChannels\":[{\"orderChannelCode\":\"2\"}],\"activityTypes\":[],\"payTypes\":[],\"payerIdNumber\":\"\",\"payerCustomerName\":\"\",\"otoOrderType\":\"\",\"otoStoreCode\":\"\",\"otoStoreName\":\"\",\"expandAmount\":\"\",\"refVerifyCode\":\"\",\"orderServiceTypeMulti\":\"\",\"popContractInfo\":{},\"deliveryTime\":\"2019-02-02 13:33:52\",\"sendType\":\"1\",\"selfDeliveryName\":\"\",\"selfDeliveryMobile\":\"\",\"returnFlag\":\"\",\"complainFlag\":\"0\",\"logisticsOrderId\":\"E018\",\"carService\":{},\"orderTagList\":\"\",\"donationProjectInfo\":{\"donationProjectId\":\"\",\"donationAmt\":\"0.00\"}}]}";
            //(1)解析json数据,并把数据放到map里面
            JSONObject json = JSONObject.fromObject(str);
    	    JSONObject obj = JSONObject.fromObject(json);
    	    System.out.println(obj.getString("orderCode"));
    	    System.out.println(obj.getString("userName"));
    	    System.out.println(obj.getString("customerName"));
    	    System.out.println(obj.getString("customerAddress"));
    	    System.out.println(obj.getString("mobNum"));
    	    System.out.println(obj.getString("orderSaleTime"));
    	    System.out.println(obj.getString("orderTotalStatus"));
    	    System.out.println(obj.getString("provinceCode"));
    	    System.out.println(obj.getString("cityCode"));
    	    System.out.println(obj.getString("districtName"));
    	    System.out.println(obj.getString("sellerOrdRemark"));
    	    //(2)解析下边一层,提取数组里面第一个json里面的节点
    	    JSONArray json2 = json.getJSONArray("orderDetail");
    	    JSONObject obj2 = JSONObject.fromObject(json2.get(0));
    	    System.out.println("继续解析里面的一层,提取自己需要的数据");
    	    System.out.println("obj2.getJSONObject(\"donationProjectInfo\").getString(\"donationAmt\"):"+obj2.getJSONObject("donationProjectInfo").getString("donationAmt"));
    	    
    	}
    
    }

    输出结果:

     

    展开全文
  • JSON数组对象某个属性值查找

    千次阅读 2018-06-15 10:43:00
    1、引用国外开源Linq写法的js框架 地址:https://archive.codeplex.com/?p=jslinq https://www.nuget.org/packages/jslinq 说明实例:... ...script src="js/linq.js">.../scr...

    1、引用国外开源Linq写法的js框架

    地址:https://archive.codeplex.com/?p=jslinq

    https://www.nuget.org/packages/jslinq

    说明实例:https://www.cnblogs.com/landeanfen/p/4672542.html

    <script src="js/linq.js"></script>
    
    <script type="text/javascript" >
                
                var packJson = [
                    {"name":"zhang", "password":"123"},
                    {"name":"li", "password":"456"}
                ];
                var name="li";
                var de=Enumerable.From(packJson).Where("x=>x.name=='"+name+"'").ToArray();
                if(de!=null && de[0]!=null){
                    console.log(de[0].password);    
                }
    </script>

     

    转载于:https://www.cnblogs.com/wgx0428/p/9186304.html

    展开全文
  • mysql json类型快速入门

    千次阅读 2016-01-27 16:40:30
    mysql json快速入门
    

    MySQL 5.7.8开始支持 json类型.


    create table t(id int,js json,PRIMARY KEY (`id`))

    插入数据
    insert into t values(1,'{"a":1,"s":"abc"}')
    insert into t values(2,'[1,2,{"a":123}]')
    insert into t values(3,'"str"')
    insert into t values(4,'123')

    直接提供字符串即可。还可以用JSON_Array和JSON_Object函数来构造
    insert into t values(5,JSON_Object('key1',v1,'key2',v2))
    insert into t values(4,JSON_Array(v1,v2,v3))

    JSON_OBJECT([key, val[, key, val] ...])
    JSON_ARRAY([val[, val] ...])



    JSON_SET(json_doc, path, val[, path, val] ...)
    修改数据

    update t set js=json_set('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') where id=1

    结果js={"a":456,"s":"abc","b":"bbb"}

    path中$就代表整个doc,然后可以用javascript的方式指定对象属性或者数组下标等.
    执行效果,类似json的语法
    $.a=456
    $.b="bbb"

    存在就修改,不存在就设置.

    $.c.c=123
    这个在javascript中会出错,因为.c为null。
    但是在json_set('{}','$.c.c',123)中,不存在的路径将直接被忽略。

    特殊的对于数组,如果目标doc不是数组则会被转换成[doc],然后再执行set,
    如果set的下标超过数组长度,只会添加到数组结尾。

    select json_set('{"a":456}','$[1]',123)
    结果[{"a":456},123]。目标现被转换成[{"a":456}],然后应用$[1]=123。

    select json_set('"abc"','$[999]',123)
    结果["abc",123]。


    再举几个例子
    select json_set('[1,2,3]','$[0]',456,'$[3]','bbb')
    结果[456,2,3,'bbb']

    注意:
    对于javascript中
    var a=[1,2,3]
    a.a='abc'
    是合法的,但是一旦a转成json字符串,a.a就丢失了。

    而在mysql中,这种算作路径不存在,因此
    select json_set('[1,2,3]','$.a',456)
    结果还是[1,2,3]


    然后还有另外两个版本
    JSON_INSERT(json_doc, path, val[, path, val] ...)
    如果不存在对应属性则插入,否则不做任何变动

    JSON_REPLACE(json_doc, path, val[, path, val] ...)
    如果存在则替换,否则不做任何变动

    这两个操作倒是没有javascript直接对应的操作
    select json_insert('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
    结果{"a":1,"s":"abc","b":"bbb"}

    select json_replace('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
    结果{"a":456,"s":"abc"}

    加上删除节点
    JSON_REMOVE(json_doc, path[, path] ...)
    如果存在则删除对应属性,否则不做任何变动
    select json_replace('{"a":1,"s":"abc"}','$.a','$.b')
    结果{"s":"abc"}

    涉及数组时,三个函数与json_set基本一样
    select json_insert('{"a":1}','$[0]',456)
    结果不变,认为0元素已经存在了,注意这里结果不是[{"a":1}]

    select json_insert('{"a":1}','$[999]',456)
    结果追加到数组结尾[{"a":1},456]


    select json_replace('{"a":1}','$[0]',456)
    结果456!而非[456]

    select json_replace('{"a":1}','$[1]',456)
    结果不变。

    其实对于json_insert和json_replace来说一般情况没必要针对数组使用。



    select json_remove('{"a":1}','$[0]')
    结果不变!

    select json_remove('[{"a":1}]','$[0]')
    结果[]

    总之涉及数组的时候要小心。


    JSON_MERGE(json_doc, json_doc[, json_doc] ...)
    将多个doc合并

    select json_merge('[1,2,3]','[4,5]')
    结果[1,2,3,4,5]。数组简单扩展

    select json_merge('{"a":1}','{"b":2}')
    结果{"a":1,"b":2}。两个对象直接融合。

    特殊的还是在数组
    select json_merge('123','45')
    结果[123,45]。两个常量变成数组

    select json_merge('{"a":1}','[1,2]')
    结果[{"a":1},1,2]。目标碰到数组,先转换成[doc]

    select json_merge('[1,2]','{"a":1}')
    结果[1,2,{"a":1}]。非数组都追加到数组后面。


    JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
    给指定的节点,添加元素,如果节点不是数组,则先转换成[doc]

    select json_Array_append('[1,2]','$','456')
    结果[1,2,456]

    select json_Array_append('[1,2]','$[0]','456')
    结果[[1,456],2]。指定插在$[0]这个节点,这个节点非数组,所以等效为
    select json_Array_append('[[1],2]','$[0]','456')


    JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
    在数组的指定下标处插入元素

    SELECT JSON_ARRAY_INSERT('[1,2,3]','$[1]',4)
    结果[1,4,2,3]。在$数组的下标1处插入

    SELECT JSON_ARRAY_INSERT('[1,[1,2,3],3]','$[1][1]',4)
    结果[1,[1,4,2,3],3]。在$[1]数组的下标1处插入

    SELECT JSON_ARRAY_INSERT('[1,2,3]','$[0]',4,'$[1]',5)
    结果[4,5,1,2,3]。注意后续插入是在前面插入基础上的,而非[4,1,5,2,3]


    提取json信息的函数
    JSON_KEYS(json_doc[, path])
    返回指定path的key

    select json_keys('{"a":1,"b":2}')
    结果["a","b"]

    select json_keys('{"a":1,"b":[1,2,3]}','$.b')
    结果null。数组没有key


    JSON_CONTAINS(json_doc, val[, path])
    是否包含子文档

    select json_contains('{"a":1,"b":4}','{"a":1}')
    结果1

    select json_contains('{"a":2,"b":1}','{"a":1}')
    结果0

    select json_contains('{"a":[1,2,3],"b":1}','[1,2]','$.a')
    结果1。数组包含则需要所有元素都存在。

    select json_contains('{"a":[1,2,3],"b":1}','1','$.a')
    结果1。元素存在数组元素中。


    JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
    检查路径是否存在

    select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'one','$.a','$.c')
    结果1。只要存在一个

    select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'all','$.a','$.c')
    结果0。必须全部存在。


    select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.b.c.d')
    结果1。

    select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.a.c.d')
    结果0。


    JSON_EXTRACT(json_doc, path[, path] ...)
    获得doc中某个或多个节点的值。

    select json_extract('{"a":1,"b":2}','$.a')
    结果1

    select json_extract('{"a":[1,2,3],"b":2}','$.a[1]')
    结果2


    select json_extract('{"a":{"a":1,"b":2,"c":3},"b":2}','$.a.*')
    结果[1,2,3]。a.*通配a所有属性的值返回成数组。


    select json_extract('{"a":{"a":1,"b":2,"c":3},"b":4}','$**.b')
    结果[2,4]。通配$中所有层次下的属性b的值返回成数组。

    mysql5.7.9开始增加了一种简写方式:column->path

    select id,js->'$.id' from t where js->'$.a'=1 order by js->'$.b'
    等价于
    select id,json_extract(js,'$.id')
    from t where json_extract(js,'$.a')=1
    order by json_extract(js,'$.b')



    JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
    强大的查询函数,用于在doc中返回符合条件的节点,select则是在表中返回符合要求的纪录。

    select json_search('{"a":"abc","b":{"c":"dad"}}','one','%a%')

    结果$.a。和like一样可以用%和_匹配,在所有节点的值中匹配,one只返回一个。

    select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%')
    结果["$.a","$.b.c"]


    select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%',null,'$.b')
    结果["$.b.c"]。限制查找范围。

    select json_search('{"a":"abc","b":{"c":"dad"},"c":{"b":"aaa"}}','all','%a%',null,'$**.b')
    结果["$.b.c","$.c.b"]。查找范围还可使用通配符!在每个匹配节点和其下查找。


    注意,只有json_extract和json_search中的path才支持通配,其他json_set,json_insert等都不支持。


    JSON_LENGTH(json_doc[, path])
    返回数组的长度,如果是object则是属性个数,常量则为1

    select json_length('[1,2,3]')
    结果3

    select json_length('123')
    结果1

    select json_length('{"a":1,"b":2}')
    结果2

    可再跟path参数
    select json_length('{"a":1,"b":[1,2,3]}','$.b')
    结果3


    JSON_DEPTH(json_doc)
    返回doc深度


    select json_depth('{}'),json_depth('[]'),json_depth('123')
    结果1,1,1

    select json_depth('[1,2,3,4,5,6]')
    结果2

    select json_depth('{"a":{"b":{"c":1}}}')
    结果4

    展开全文
  • 算法-C快速获取json字段内的数据

    千次阅读 2018-03-31 14:17:29
    【直接撸代码】:(为了凑一点篇幅,特意加了点注释)/*****************************************************************************... 功能描述 : 获取json指定的字段 输入参数 : char *in_buff char *key ...
  • 开发过程中,数据处理经常会遇到需要从JSON中取值的情况。对应结构简单的JSON,我们可以像字典那样获取到想要的值;对于结构复杂的多层嵌套的JSON,知道要取值的key的‘路径’的话,也可以使用一些三方库(如...
  • package.json文件快速入门详解

    千次阅读 2018-06-01 21:55:23
    写在前面 相信入门nodejs或者npm的同学会对package....**npm在package.json文件中管理项目的依赖项以及项目的元数据。 node执行js中require的时候,也会根据package.json中的依赖项查找。** package.json在npm...
  • json-server快速入门

    2018-02-26 16:21:31
    json-server 的安装使用 1.全局安装json-server(确保已经装...3.让json-server指向监测文件并指定监测端口 json-server 文件名.js -p xxxx tips:登录设置的主页地址,可以得到对应json的路由结构,比如: ...
  • mysql 操作json格式数据

    千次阅读 2019-02-25 16:30:26
    11.6 JSON数据类型 创建JSONJSON值的规范化,合并和自动包装 搜索和修改JSONJSON路径语法 JSON值的比较和排序 在JSON和非JSON值之间转换 JSON值的聚合 从MySQL 5.7.8...
  • json字符串:使用re、json、jsonpath等模块来提取特定数据(高频出现) xml字符串:使用re、lxml等模块来提取特定数据(低频出现) (2)非机构化响应 html字符串:可以使用re、lxml等模块来提取特定数据 1、...
  • Android网络数据JSON解析使用总结

    万次阅读 多人点赞 2016-11-16 13:50:51
    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。
  • springboot 获取前端json数据几种方法

    千次阅读 2020-07-07 16:07:24
    JQuery Ajax 以 application/x-www-form-urlencoded 上传 JSON对象 , 后端用 @RequestParam 或者Servlet 获取参数。 JQuery Ajax 以 application/json 上传 JSON字符串, 后端用 @RquestBody 获取参数,或者@...
  • 查找和修改 JSONJSON路径语法 JSON值的比较和排序 在JSON和非JSON值之间转换 JSON值聚合 官方文档地址【译自】:https://dev.mysql.com/doc/refman/8.0/en/json.html 前言 从MySQL 5.7.8开始,MySQL支....
  • JSON

    2016-10-21 09:06:28
    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、...
  • json

    2017-08-07 11:23:52
    因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型: 对象表示为键值对 数据由逗号分隔 花括号保存对象 方括号保存...
  • JSON-Schema是JSON文档的标准,描述了JSON数据的结构和要求。 在这个由两部分组成的系列文章中,您将学习如何使用JSON-Schema来验证数据。 假设您有一个用户数据库,其中每个记录看起来都类似于此示例: { "id...
  • 获取json数据中某个节点的值

    千次阅读 2020-04-02 23:11:55
    在做接口开发时常遇到获取某个接口json数据中某个节点的值,下面的工具就能实现。 例:如下json数据,要获取phone的值 { "subject": { "createBy": 1, "delFlag": 0, "departmentId": 1, "direction": "IN", ...
  • MySQL json 类型操作快速入门

    万次阅读 2016-11-08 14:15:20
    MySQL 5.7.8开始支持 json类型. create table t(id int,js json,PRIMARY KEY ...插入数据 insert into t values(1,'{"a":1,"s":"abc"}') insert into t values(2,'[1,2,{"a":123}]') insert into t values
  • JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具. JsonPath有许多编程语言,如Javascript、Python、PHP、Java等 JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足...
  • JSON Viewer中文绿色版

    2018-06-08 16:12:54
    JSON Viewer是一款桌面比较简洁查,操作简单,针对JSON的查看软件, 并且该查看工具支持插件允许您自定义,使用快速,轻松将JSON 对象的显示格式显示,具有独特的显示功能,又能将你的大量的JSON字符串进行格式化...
  • var oDiv = '' catgory.forEach((item,index) => { oDiv += "<div>" oDiv += "<p class='drugTitle'>"+item.name+"</p>" var itemList = item.list; oDiv += "<... ...
  • 九、数据绑定流程分析 1、提出问题 日期字符串格式的表单参数,提交后转换为Date类型  &lt;!-- 解决问题:  1.数据类型转换  2.数据格式  3.数据校验  --&gt; BirthDay :&...
  • 数据处理: 一、数据提取的概念和数据的分类: 1 爬虫中数据的分类 在爬虫爬取的数据中有很多不同类型的数据,我们需要了解数据的不同类型来又规律的提取和...1.爬虫中数据分类之结构化数据: json,xml 2.爬虫中数据分...
  • js中获取json数据的某个key-value

    千次阅读 2017-09-04 09:00:00
    if(item==key){ //item 表示Json串中的属性,如'name' var jValue=jsonObj[item];//key所对应的value alert(jValue); } }   转载于:...
  • 什么是Json?

    2019-01-26 12:18:47
    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次...
  • 项目开发中和第三方系统API对接经常会涉及到json数据的解析问题、使用正则可以快速匹配到关键字值 /// &lt;summary&gt;  /// 正则表达式  /// &lt;/summary&gt;  private class RegexMatch { ...
  • C++JSON解析器

    千次阅读 2017-02-27 15:15:24
    2012年,在公司项目刚接触到要使用JSON时,几个前端项目都是用MFC开发的,没找到合适的...3. 在项目中不是一个纯粹的JSON工具,可作为数据结构来使用 4. 内存自动释放 5. 路径表达式获取或设置 json结构中的某个字段 6.
  • 什么是Json

    2017-03-22 09:16:29
    Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。 它基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换...
  • 使用JSONPath快速读取和修改复杂JSON

    千次阅读 2019-07-25 16:55:55
    此时这个o就是name为李狗蛋的json对象 2 修改name为李狗蛋对象的年龄 JSONPath.set(jsonObject,"$.person[?(@.name = '李狗蛋')].age","24"); 具体其他语法的使用还在学习中。。。。
  • 在数组中查找指定元素 Java 实例 - 判断数组是否相等 Java 实例 - 数组并集 Java 时间处理 Java 实例 - 格式化时间(SimpleDateFormat) Java 实例 - 获取当前时间 Java 实例 - ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,910
精华内容 9,964
关键字:

json对象快速查找指定数据