精华内容
下载资源
问答
  • 下面哪个是json数据
    千次阅读
    2022-02-10 09:41:45

    从结构上看,所有的数据(data)最终都可以分解成三种类型

    第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。

    第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。

    第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如"首都:北京"。

    数据构成的最小单位原来如此简单!难怪在编程语言中,只要有了数组(array)和对象(object)就能够储存一切数据了。

    21世纪初,Douglas Crockford寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是XML,但是Douglas Crockford觉得XML的生成和解析都太麻烦,所以他提出了一种简化格式,也就是Json。

    Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。

    1) 并列的数据之间用逗号(", ")分隔。

    2) 映射用冒号(": ")表示。

    3) 并列数据的集合(数组)用方括号("[ ]")表示。

    4) 映射的集合(对象)用大括号("{ }")表示。

    上面四条规则,就是Json格式的所有内容。

    比如,下面这句话:

    "北京市的面积为16800平方公里,常住人口1600万人。上海市的面积为6400平方公里,常住人口1800万。"

    写成json格式就是这样:

    [
      {"城市":"北京","面积":16800,"人口":1600},
      {"城市":"上海","面积":6400,"人口":1800}
    ]

    如果事先知道数据的结构,上面的写法还可以进一步简化:

    [
      ["北京",16800,1600],
      ["上海",6400,1800]
    ]

    由此可以看到,json非常易学易用。所以,在短短几年中,它就取代xml,成为了互联网上最受欢迎的数据交换格式。

    更多相关内容
  • json数据

    千次阅读 2021-07-13 10:28:01
    Android中关于json数据,相当于键值对 1.生成json数据 {"type":"Point", "coordinates":[ 533958.52189999819, 3123489.1460000016 ] } 可以看到上面的type和coordinates分别是json的对象结构和数据结构 ...

    json数据包括JSONObject和JSONArray。

    即json包括json对象和json数组,json对象中有2种数据结构,对象结构和数组结构。

    JSONObject的数据格式:{“名称”:“值”,“名称”:[数组],……}

    JSONArray的数据格式:[{“名称”:“值”},{“名称”:[数组]},{“名称”:“值”},……]
    JSONArray中包含1个或多个JSONObject

    json数据,相当于键值对,下面我们来看一个复杂的json数据

    {
        "features":[
            {
                "id":1,
                "geometry":{
                    "type":"Point",
                    "coordinates":[
                        533958.52189999819,
                        3123489.1460000016
                    ]
                }
            },
           {
                "id":1,
                "geometry":{
                    "type":"Point",
                    "coordinates":[
                        533958.52189999819,
                        3123489.1460000016
                    ]
                }
            },
        ]
    }

    关于java处理json的框架库有Jackson,Gson和FastJson等,我目前只用过fastjson库,Jackson是SpringBoot默认的json解析,听说Gson功能上好,FastJson不建议生产使用,也听过Gson和FastJson两种并行使用。

    下面的代码我们用的是fastjson库,Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发。fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快。

    一.生成json数据

    1.通过原生生成json数据

    //json对象
    JSONObject j1 = new JSONObject();
    j1.put("type", "Point");    //对象结构
    j1.put("coordinates", new double[]{533958.52189999819, 3123489.1460000016});//数组结构
    
    //json数组
    JSONArray jsonArray1 = new JSONArray();
    jsonArray1.add(j1);

    2.json字符串生成json数据

    //生成json对象
    String stuString = "{\"id\":1,\"age\":2,\"name\":\"zhang\"}";//引号需要转义字符
    JSONObject jsonObject1 = JSON.parseObject(stuString);
    
    //生成json数组
    String stuString2 = "[{\"id\":1,\"age\":2,\"name\":\"zhang\"}]";//引号需要转义字符
    JSONArray jsonArray1 = JSON.parseArray(stuString2);
    
    //上面的JSON换成JSONObject或者JSONArray都可以因为parseObject方法和parseArray方法在JSON中,而JSONObject和JSONArray都继承自JSON
    

    3.json字符串生成对应的类

    Student stu1= JSON.parseObject(stuString,Student.class);
    List<Student>  stu2= JSON.parseArray(studentLsit,Student.class);
    //字符串stuString中存放的是json对象,字符串studentLsit中存放的json数组

    4.读取数据

    //JSON实际上也是键值对("key":"value")
    //key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)
    int a1= js.getIntValue("s1");
    long a3= js.getLongValue("s2");
    String a2= js.getString("s3");
    Object o= js.get("name");
    JSONObject js1=js.getJSONObject("s4");
    JSONArray js2=js.getJSONArray("s5");

    5.通过实体生成json对象和json字符串

    Student student = new Student();
    student.setId(1);
    student.setAge("20");
    student.setName("张三");
    JSONObject js= (JSONObject) JSON.toJSON(student);//通过实体生成json对象
    String stuString = JSON.toJSONString(student);   //通过json类中的方法转换成字符串
    String stuString2 = JSON.toJSON(student).toString();//通过Object中的方法转换成字符串
    String stuString3 = js.toString();//其实就是调用JSON中的toJSONString方法
    
    ArrayList<Student> studentLsit = new ArrayList<>();
    studentLsit.add(student);
    JSONArray js2= (JSONArray) JSON.toJSON(studentLsit);//通过实体数组生成json对象
    String stuLsitString = JSON.toJSONString(studentLsit);//通过json类中的方法转换成字符串
    String stuLsitString2 = JSON.toJSON(studentLsit).toString();//通过Object中的方法转换成字符串
    String stuLsitString3 = js2.toString();//其实就是调用JSON中的toJSONString方法
    //同理,JSON也可以换成JSONObject或者JSONArray

    6.遍历json数组

    //遍历json数组
            JSONArray jsonArray=JSONObject.parseArray(data);
            JSONObject object;
            if(jsonArray.size()>0){
                for(int i=0;i<jsonArray.size();++i){
                    // 遍历 jsonarray 数组,把每一个对象转成 json 对象
                    object =jsonArray.getJSONObject(i);
                    String stuString = JSONObject.toJSONString(object);
                }
            }

    7.判断是json对象还是json数组

        JSONObject json = JSONObject.parseObject(s1); //得到整个json串
        Object o=json.get("terrainEntity");        //获取到对应的json对象
            if(o instanceof JSONArray){    //判断是那个类
            JSONArray json2=json.getJSONArray("terrainEntity");
        }
            else if(o instanceof JSONObject){
            JSONObject json2=json.getJSONObject("terrainEntity");
        }
    //instanceof关键字,是用来判断前面的那个是属于哪个类的

    二.总结

    根据最上面的json数据,可以看到上面的type和coordinates分别是json的对象结构和数据结构

    直接用JSONObject创建即可。

    然后就是创建嵌套的json数据

    首先我们先要创建一个

                //首先创建一个JSONObject,因为是json的对象结构
                JSONObject jsonObject = new JSONObject();
                JSONArray jsonArray1 = new JSONArray();
                for(int i=0;i<2;++i) {
                    //创建一个嵌套的json数据,
                    JSONObject j2 = new JSONObject(); 
                    j2.put("id", 1);
                    JSONObject j21 = new JSONObject();
                    j21.put("type", "Point");
                    j21.put("coordinates", new double[]{533958.52189999819, 3123489.1460000016});
                    j2.put("geometry", j21);
                    //数组中,添加每一个json数据
                    jsonArray1.add(j2);
                }
                jsonObject.put("features",jsonArray1);
    

    fastjson的apihttps://www.w3cschool.cn/fastjson/fastjson-stream.html

    使用fastjson在处理超大文本反序列化,具体是指,把从服务器端获取到的超大json文本数组(每一个json对象中的内容也很多很长,具体有好多键值对),然后我要把这个json数组转换成类对象的数组的时候,就会出错,具体处理方式,这个fastjson好像有超大JSON文本序列化和反序列化的方法,下次遇到了,可以看看学习一下,目前还不会用。

    展开全文
  • 如何用Python解析JSON数据

    千次阅读 2021-10-29 14:23:17
    使用Python读取和解析JSON数据教程 JSON格式是网站和API使用的通用标准格式,现在主流的一些数据库(如PostgreSQL)都支持JSON格式。在本文中,我们将介绍如何使用Python处理JSON数据。首先,让我们先来看看JSON的...

    使用Python读取和解析JSON数据教程

    JSON格式是网站和API使用的通用标准格式,现在主流的一些数据库(如PostgreSQL)都支持JSON格式。在本文中,我们将介绍如何使用Python处理JSON数据。 您也可以前往我们的中文官网Oxylabs.cn获取更多信息。首先,让我们先来看看JSON的定义。

    什么是JSON?

    JSON或JavaScript Object Notation,是一种使用文本存储数据对象的格式。换句话说,它是一种数据结构,将对象用文本形式表示出来。尽管它来源自JavaScript,但它已成为传输对象的实际标准。

    大多数流行的编程语言都支持JSON格式,包括Python。JSON格式的文件经常用于API传输数据对象。以下是JSON字符串的示例:

    {
       "name": "United States",
       "population": 331002651,
       "capital": "Washington D.C.",
       "languages": [
      "English",
      "Spanish"
       ]
    }

    在这个例子中,JSON数据看起来像一个Python字典。像字典一样,JSON以键值对的形式传递数据。然而,JSON数据也可以是字符串、数字、布尔值或列表。

    在JSON流行之前,XML一直是以文本格式表示数据对象的常见选择。以下是XML格式的相同信息的示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <country>
       <name>United States</name>
       <population>331002651</population>
       <capital>Washington D.C.</capital>
       <languages>
           <language>English</language>
           <language>Spanish</language>
       </languages>
    </country>

    很明显,JSON代码量更少。这是JSON如此流行的主要原因之一。如果您想了解有关JSON标准的更多信息,请访问JSON官方网站

    Python中的JSON

    Python原生支持JSON数据。Python json模块是标准库的一部分。该json模块可以将JSON数据从JSON格式转换到等效的Python对象,例如dictionarylist。JSON模块还可以将Python对象转换为JSON格式。

    Python的json模块提供编写自定义编码器和解码器功能,无需单独安装。您可以在此链接里找到Pythonjson模块的官方文档。

    接下来,我们将研究下这个模块。我们将把JSON转换为dictionarylist。我们还将尝试处理自定义类。

    将JSON字符串转换为Python对象

    JSON数据经常存储在字符串中。这是使用API时的常见场景。JSON数据在解析之前一般存储在字符串变量中。因此,与JSON相关的最常见任务是将JSON字符串解析为Python字典。JSON模块可以轻松处理此任务。

    第一步是导入Python的json模块。该模块包含两个重要的功能-loadsload

    请注意,第一种方法看起来像复数形式,但事实并非如此。字母“S”代表“字符串”。

    loads是将字符串解析为JSON数据。请注意,它读作“load-s”。这里的“s”代表“字符串”。Load的使用场景是当数据以字节为单位时。这部分后面会详细介绍。

    让我们从一个简单的例子开始。JSON数据实例如下:

    {
       "name": "United States",
       "population": 331002651,
    }

    JSON数据可以在解析之前存储为JSON字符串。我们不仅可以使用Python的三引号来存储多行字符串,也可以通过删除换行符来提高可读性。

    # JSON string
    country = '{"name": "United States", "population": 331002651}'
    print(type(country))

    此代码段的输出将确认这确实是一个JSON字符串:

    <class 'str'>

    我们可以调用该json.loads()并将此字符串作为参数。

    import json
    
    country = '{"name": "United States", "population": 331002651}'
    country_dict = json.loads(country)
    
    print(type(country))
    print(type(country_dict))

    此代码段的输出将确认作为字符串的JSON数据现在已经是Python字典。

    <class 'str'>
    <class 'dict'>

    这本字典可以像往常一样正常访问:

    print(country_dict['name']) 
    ​​​​​​​# OUTPUT: United States

    需要注意的是,json.loads()方法并不总是返回字典。返回的数据类型将取决于输入的字符串。例如,下面这个JSON字符串将返回一个列表,而不是一个字典。

    countries = '["United States", "Canada"]'
    counties_list= json.loads(countries)
    print(type(counties_list))
    # OUTPUT: 

    同样,如果JSON字符串包含true,它将被转换为Python等效的布尔值,即True

    import json 
    bool_string = 'true'
    bool_type = json.loads(bool_string)
    print(bool_type)
    # OUTPUT:  True

    下表显示了转换后的JSON对象和Python数据类型。

    JSON

    Python

    object

    dict

    array

    list

    string

    str

    number (integer)

    int

    number (real)

    float

    true

    True

    false

    False

    null

    None

    接下来我们将继续下一个主题,将JSON对象解析为Python对象。

    将JSON文件转换为Python对象

    读取JSON文件,并将JSON数据解析为Python数据,与我们解析存储在字符串中JSON数据的方式非常相似。除了JSON,我们还需要Python的原生函数open()

    一般loads用于读取JSON字符串,而load()用于读取文件中的JSON数据。

    load()方法接收一个文件对象并返回解析为Python对象的JSON数据。

    要从文件路径中获取文件对象,可以使用Python的函数open()。

    将以下JSON数据另存为新文件并将其命名为united_states.json

    {
       "name": "United States",
       "population": 331002651,
       "capital": "Washington D.C.",
       "languages": [
      "English",
      "Spanish"
       ]
    }

    在新文件中输入此Python脚本:

    import json
    
    with open('united_states.json') as f:
      data = json.load(f)
    
    print(type(data))

    运行此Python文件会输出以下内容:

    <class 'dict'>

    在此示例中,该open函数返回一个文件句柄,该句柄会提供给load

    变量data包含JSON,作为Python字典。这意味着可以按如下方式检查字典键:

    print(data.keys())
    
    # OUTPUT:  dict_keys(['name', 'population', 'capital', 'languages'])

    使用此信息,name可以输出如下:

    data['name']
    
    # OUTPUT: United States

    在前两节中,我们研究了如何将JSON转换为Python对象。现在,我们来看看如何将Python对象转换为JSON对象。

    将Python对象转换为JSON字符串

    将Python对象转换为JSON对象也称为序列化或JSON编码。可以使用函数dumps()来实现。它被读作dump-s,字母S代表字符串。

    以下是一个简单的例子。将此代码作为Python脚本保存在新文件中:

    import json
    
    languages = ["English","French"]
    country = {
           "name": "Canada",
           "population": 37742154,
           "languages": languages,
           "president": None,
    }
    
    country_string = json.dumps(country)
    print(country_string)

    使用Python运行此文件时,将输出以下结果:

    {"name": "Canada", "population": 37742154, "languages": ["English", "French"],
    
     "president": null}

    Python对象现在就是一个JSON对象了。这个简单的例子展示了将Python对象解析为JSON对象的过程,整个过程并不复杂。而此处的Python对象是一个字典。这就是它被转换为JSON对象类型的原因。同样,列表也可以转换为JSON。这是对应的Python脚本及其输出:

    import json
    
    languages = ["English", "French"]
    
    languages_string = json.dumps(languages)
    print(languages_string)
    # OUTPUT:   ["English", "French"]

    它不仅限于字典和列表。string,int,float,bool甚至None值都可以转换为JSON。

    有关详细信息,请参阅下面的转换表。可以看到,只有字典被转换为json对象类型。有关官方文档,请参阅此链接

    Python

    JSON

    dict

    object

    list,tuple

    array

    str

    string

    int,float,int

    number

    True

    true

    False

    false

    None

    null

    将Python对象写入JSON文件

    用于编写JSON文件的方法是dump().这种方法与dumps()方法非常相似。唯一的区别是dumps()返回一个字符串,dump()写入一个文件。

    下面是一个简单的演示,将以编辑模式打开文件并将数据写成JSON格式。保存此Python脚本并运行它。

    import json
    
    # Tuple is encoded to JSON array.
    languages = ("English", "French")
    # Dictionary is encoded to JSON object.
    country = {
        "name": "Canada",
        "population": 37742154,
        "languages": languages,
        "president": None,
    }
    
    with open('countries_exported.json', 'w') as f:
    json.dump(country, f)

    使用Python执行此代码时,countries_exported.json会创建(或覆盖)文件,内容为以上JSON文件。

    但是,您会发现整个JSON都在一行中。为了使它更具可读性,我们可以再传递一个参数给dump()函数,如下所示:

    json.dump(country, f, indent=4)

    这一次,当您运行代码时,格式就正常了,同时还会缩进4个空格:

    {
         "languages": [
         "English",
         "French"
          ],
         "president": null,
          "name": "Canada",
          "population": 37742154
    }

    注意,indent参数也可用于JSONdumps()方法。JSONdump()和JSONdumps()唯一区别是dump()需要一个文件对象。

    将自定义Python对象转换为JSON对象

    让我们检查dump()方法的签名:

    dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True,allow_nan=True, cls=None, indent=None, separators=None,default=None, sort_keys=False, **kw)

    重点关注参数cls。

    如果在调用dump方法时没有Class,则dump()dumps()方法都会默认为JSONEncoder该类。此类支持标准的Python类型有:dict,list,tuple,str,int,float,True,False,和None。

    如果我们尝试json.loads()在任何其他类型上调用该方法,则此方法将引发TypeError的报错信息:Object of typeis not JSON serializable。

    将以下代码另存为Python脚本并运行:

    import json
    
    class Country:
         def __init__(self, name, population, languages):
            self.name = name
            self.population = population
            self.languages = languages
    
    canada = Country("Canada", 37742154, ["English", "French"])
    
    print(json.dumps(canada))
    
    # OUTPUT:   TypeError: Object of type Country is not JSON serializable

    要将对象转换为JSON,我们需要编写一个扩展JSONEncoder的新类。在这个类中,需要实现default()。此方法将具有返回JSON的自定义代码。

    以下是Country类的示例编码器。这个类将帮助将Python对象转换为JSON对象:

    import json
    
    class CountryEncoder(json.JSONEncoder):
         def default(self, o):
         if isinstance(o, Country):
                # JSON object would be a dictionary.
                    return {
                    "name" : o.name,
                    "population": o.population,
                    "languages": o.languages
               }
         else:
               # Base class will raise the TypeError.
               return super().default(o)

    这段代码在确认提供的对象是Country类的实例后会返回一个字典,或者调用父级来处理其余的情况。

    这个类可以提供给json.dump()json.dumps()方法。

    print(json.dumps(canada, cls=CountryEncoder))
    # OUTPUT:  {“name": "Canada", "population": 37742154, "languages": ["English", "French"]}

    从JSON对象创建Python类对象

    到目前为止,我们已经讨论了如何使用json.load()json.loads()方法创建字典、列表等。如果我们想读取JSON对象并创建自定义类对象又该怎么办?

    在本节中,我们将创建一个自定义JSON解码器,帮助我们创建自定义对象。这个自定义解码器将允许我们使用json.load()json.loads()方法,并返回一个自定义类对象。

    我们将使用上一节中使用的Country类。使用自定义编码器,我们能够编写如下代码:

    # Create an object of class Country
    canada = Country("Canada", 37742154, ["English", "French"])
    # Use json.dump() to create a JSON file in writing mode
    with open('canada.json','w') as f:
           json.dump(canada,f, cls=CountryEncoder)

    如果我们尝试使用json.load()方法解析这个JSON文件,我们将得到一个字典:

    with open('canada.json','r') as f:
            country_object = json.load(f)
    # OUTPUT:  <type ‘dict'="">

    如果要获取Country类的实例而不是字典,我们需要创建一个自定义解码器。这个解码器类将扩展JSONDecoder。在这个类中,我们将编写object_hook.这样可以从字典中读取值来创建Country类的对象。

    除了编写这个之外,我们还需要调用__init__基类并将参数object_hook的值设置为这个方法的名称。为简单起见,我们可以使用相同的名称。

    import json
    
    class CountryDecoder(json.JSONDecoder):
         def __init__(self, object_hook=None,
    *args, **kwargs):
               super().__init__(object_hook=self.object
    _hook, *args, **kwargs)
    
         def object_hook(self, o):
         decoded_country =  Country(
             o.get('name'),
             o.get('population'),
             o.get('languages'),
         )
         return decoded_country

    注意,我们会使用.get()方法来读取字典键。这将确保在字典中缺少键时不会引发错误。

    最后,我们可以调用json.load()方法并将cls参数设置为CountryDecoder类。

    with open('canada.json','r') as f:
        country_object = json.load(f, cls=CountryDecoder)
    
    print(type(country_object))
    # OUTPUT:  <class ‘country'="">

    搞定!我们现在就有一个直接从JSON创建的自定义对象了。

    Loading与dumping对比

    Python的JSON模块有四个主要功能:read(),reads(),load(),和loads()。这些功能常常会让人混淆。最重要的地方是字母“s”代表String。另外,在函数loads()dumps()中的字母“s”需要分开读,loadsload-s,dumps()dump-s。

    这是一个快速表格,可帮助您记住这些功能:

    _

    File

    String

    Read

    load()

    loads()

    Write

    dump()

    dumps()

    结论

    在本教程中,我们学习了使用Python读取和写入JSON数据。尤其是在处理网站时,了解如何处理JSON数据至关重要。JSON用于很多地方传输和存储数据,包括API、网络爬虫和现代数据库(如PostgreSQL)。

    如果您正在从事涉及动态网站的网络抓取项目,那么了解JSON至关重要。可以阅读我们的文章,了解JSON实例在无限滚动页面中的应用。

    展开全文
  • MySQL数据库的JSON数据类型详解

    千次阅读 2022-04-21 10:17:09
    存储JSON串 insert into commodity(commodity_id,title,current_selling_price,attributes) values (9,'小米手机',2000,'{"specValueId":"3845862150911746064","specValue":"深红色","specValueType":"红色系",...

    JSON 数据类型意义

    其实,没有JSON数据类型的支持,我们一样可以通过varchar类型或者text等类型来保存这一格式的数据,但是,为什么还要专门增加这一数据格式的支持呢?其中肯定有较varchar或者text来存储此类型更优越的地方。

    1.保证了 JSON 数据类型的强校验,JSON 数据列会自动校验存入此列的内容是否符合 JSON 格式,非正常格式则报错,而 varchar 类型和 text 等类型本身是不存在这种机制的。
    2.MySQL 同时提供了一组操作 JSON 类型数据的内置函数。
    3.更优化的存储格式,存储在 JSON 列中的 JSON 数据会被转成内部特定的存储格式,允许快速读取。
    4.基于 JSON 格式的特征,支持修改指定的字段值。

    存储JSON串

    insert into commodity(commodity_id,title,current_selling_price,attributes)
    values (9,'小米手机',2000,'{"specValueId":"3845862150911746064","specValue":"深红色","specValueType":"红色系","specValueTypeId":"3845862150911746056","specId":"3845862150911746061","specName":"xx颜色","specType":"颜色","extdata1":"rgba(255, 9, 9, 1)","extdata2":"http://localhost:8080/123.png"}');
    

    这里需要提醒的是:
    JSON 类型的列存储的数据要么是 NULL,要么必须是 JSON 格式数据,否则会报错。
    JSON 数据类型默认值只能是 NULL。

    修改JSON串中指定字段的值

    可以使用两个内置函数来修改JSON串中指定字段的值,示例如下:

    # 将列attributes中的json串中的字段specValue的值设置为‘绿色’
    update commodity set attributes = JSON_SET(attributes,'$.specValue','绿色') where title like '%手机';
    # 将列attributes中的json串中的字段specValue的值替换为‘yellow’
    update commodity set attributes = JSON_REPLACE(attributes,'$.specValue','yellow') where title like '%手机';
    

    查询 JSON 串中的数据

    查询 JSON 串中指定字段的值

    select JSON_EXTRACT(attributes,'$.specValue') from commodity where commodity_id = 9;
    

    这里要特别注意了,读取json串中指定字段的值,如果该值是字符串则会把双引号也读取出来,可以使用函数 JSON_UNQUOTE() 去掉双引号:

    select json_unquote(JSON_EXTRACT(attributes,'$.specValue')) from commodity where commodity_id = 9;
    

    特殊语法

    查询列 attributes 中的 json 串中的字段 specValue 的值,可以使用下面两种查询语句:

    select attributes->>'$.specValue' from commodity;
    

    或者

    select attributes->'$.specValue' from commodity;
    

    精确查询

    假设有个名为 player 的表,有个名为 remarks 的 JSON 类型的列,存储的数据格式如下:

    {"name":"lisi","age":39,"address":{"city":"rizhao","region":"lanshan"}}
    

    查询 remarks 列中的json串的name字段的值为“zhangsan”的所有记录:

    SELECT * FROM `player` WHERE JSON_EXTRACT(`Remarks`, '$.name') = 'zhangsan';
    

    或者

    SELECT * FROM `player` WHERE JSON_CONTAINS(Remarks,JSON_OBJECT('name','zhangsan'));
    

    或者

    select * from player where json_contains(remarks,'"zhangsan"','$.name');
    

    嵌套精确查询

    查询用户居住城市是日照的所有记录:

    SELECT * FROM `player` WHERE JSON_EXTRACT(`Remarks`, '$.address.city') = 'rizhao';
    

    模糊查询

    查询列 remarks 中的json串中的字段name的值中包含“zhangsan”的所有记录:

    SELECT * FROM `player` WHERE JSON_EXTRACT(`Remarks`, '$.name') LIKE '%zhangsan%';
    

    查询列 remarks 中的 json 串中的字段 age 的值大于等于 25 的所有记录:

    SELECT * FROM `player` WHERE JSON_EXTRACT(`Remarks`, '$.age') >= 25;
    

    优化 JSON 查询

    找出颜色是“绿色”的商品:

    select * from commodity where JSON_EXTRACT(attributes,'$.specValue') = 'yellow';
    

    查看执行计划:

    explain select * from commodity where JSON_EXTRACT(attributes,'$.specValue') = 'yellow';
    

    在这里插入图片描述
    从执行计划可以看到,查询类型是全表扫描,这样的效率是很低的,那么如何优化呢?

    按照过往的思路,我们只要设计合理的索引就能避免全表扫描,但是 JSON 列不能创建索引,官方给出的方法是:基于JSON 创建一个生成列(Generated Column),然后基于生成列创建索引,从而达到对 JSON 类型列加索引的效果。

    生成列的值在插入数据时不需要设置,MySQL 会根据生成列关联的表达式自动计算填充。

    我们分三步进行演示。
    第一步,创建生成列:

    alter table commodity add column v_spec_value varchar(15) as (attributes->'$.specValue') after attributes;
    

    生成列 v_spec_value 的值根据表达式 attributes->'$.specValue' 自动计算填充。

    第二步,为 v_spec_value 创建索引:

    alter table commodity add index idx_spec_value  (v_spec_value);
    

    第三步,使用索引字段来查询:

    select * from commodity where v_spec_value = '"yellow"';
    

    在查看执行计划:

    explain select * from commodity where v_spec_value = '"yellow"';
    

    在这里插入图片描述

    有个疑问:根据表达式获取JSON串中指定字段值,如果是字符串类型的,会把双引号也获取到,导致存储时也会将双引号一起存进去,这个问题如何解决呢?

    处理 JSON 数据的常用函数

    JSON_CONTAINS_PATH

    判断 JSON 串中是否有指定的字段。

    查询列attributes 中的 json 串中含有字段 specValue的记录数量:

    SELECT count(*), JSON_CONTAINS_PATH(attributes, 'all', '$.specValue') cp FROM commodity GROUP BY cp;
    

    查询结果如下:

    在这里插入图片描述

    mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
    mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e'); -- 指定参数one,表示只要json串中含有至少一个指定字段,则返回1,否则返回0
    +---------------------------------------------+
    | JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e') |
    +---------------------------------------------+
    |                                           1 |
    +---------------------------------------------+
    mysql> SELECT JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e'); -- 指定参数all,表示json串中必须含有全部指定的字段才会返回1,否则返回0
    +---------------------------------------------+
    | JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e') |
    +---------------------------------------------+
    |                                           0 |
    +---------------------------------------------+
    mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.c.d');
    +----------------------------------------+
    | JSON_CONTAINS_PATH(@j, 'one', '$.c.d') |
    +----------------------------------------+
    |                                      1 |
    +----------------------------------------+
    mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a.d');
    +----------------------------------------+
    | JSON_CONTAINS_PATH(@j, 'one', '$.a.d') |
    +----------------------------------------+
    |                                      0 |
    +----------------------------------------+
    

    JSON_PRETTY

    返回格式化的 json 数据:

    select json_pretty(attributes) from commodity;
    

    格式化后,显示成这样:

    {
      "specId": "3845862150911746061",
      "extdata1": "rgba(255, 9, 9, 1)",
      "extdata2": "http://localhost:8080/123.png",
      "specName": "xx颜色",
      "specType": "颜色",
      "specValue": "yellow",
      "specValueId": "3845862150911746064",
      "specValueType": "红色系",
      "specValueTypeId": "3845862150911746056"
    }
    

    总结

    JSON 类型是 MySQL 5.7 版本新增的数据类型,用好 JSON 数据类型可以有效解决很多业务中实际问题。最后,我总结下今天的重点内容: 使用 JSON 数据类型,推荐用 MySQL 8.0.17 以上的版本,性能更好,同时也支持 Multi-Valued Indexes。

    1.JSON 数据类型的好处是无须预先定义列,数据本身就具有很好的描述性;
    2.不要将有明显关系型的数据用 JSON 存储,如用户余额、用户姓名、用户身份证等,这些都是每个用户必须包含的数据;
    3.JSON 数据类型推荐用于存储不经常更新的静态数据。

    参考资料

    1.https://dev.mysql.com/doc/refman/5.7/en/json-functions.html
    2.https://zhuanlan.zhihu.com/p/31823258
    3.https://dasini.net/blog/2018/07/23/30-mins-with-mysql-json-functions/

    展开全文
  • 开发过程中经常会遇到json数据的处理,而单独对json数据进行增删改并不方便,尤其是Geojson文件的处理,通过对网络资料的整理总结,下面介绍Java语言方法对json数据进行读取、添加、删除与修改操作。
  • C++解析json数据

    千次阅读 2021-08-23 14:11:55
    Json::Value fcgiRetData; ...//获取到fcgiRetData数据 ...//将fcgiRetData的json数据格式化 转载:C++解析JSON格式数据 1:封装JSON数据为string std::string DataToJson() { Json::FastWriter writerinfo; J
  • 后台返回json数据和前台解析json数据 一般来说web开发中,前台采用json数据提交给后台,后台处理数据以后返回json数据给前台,前台解析json,显示数据。 总而言之,前后台直接交换的数据格式最常用的非json数据...
  • C#处理JSON格式数据

    千次阅读 2022-02-27 21:38:43
    欢迎您成为我的读者,希望这篇文章能给你一些帮助...目前很多时候都是使用的传输格式是JSON,那么在C#中是如何处理数据的,又如何将数据转换为JSON格式。 今天咱们就来一起看看组件Newtonsoft.dll。 它是一个第三方组.
  • MySQL数据类型 - JSON数据类型 (1)

    千次阅读 2021-01-17 17:29:29
    JSON 数据类型MySQL支持由RFC 7159定义的原生JSON数据类型,它支持对JSON(JavaScript Object Notation)文档数据的高效访问。与在字符串列中存储JSON格式字符串相比,JSON数据类型提供了以下优势:●自动验证存储在...
  • 什么是JsonJson支持那些数据类型?

    万次阅读 2018-11-28 20:01:06
    首先说明什么是JsonJson 是一种轻量级的数据交换格式。它基于 javascript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。它的优点: 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。...
  • Redis 存取 JSON 数据

    万次阅读 2018-12-26 11:22:45
    Redis 存取 JSON 数据 本文来自网络,本人稍加修改 关于下面rejson安装的修正!!! rejson安装我的按照下面的不行 我是下载rejson后,直接make,然后在src下发现有一个rejson.so,我直接用的这个 另外我启动的时候也...
  • JSON作为一种轻量级的数据交换格式,通常采用完全独立于编程语言的文本格式来存储和表示数据。它的层次结构简洁清晰,易于人们的阅读和编写,此外机器编写和生成也会变得容易,可以有效地提升网络传输效率,这些因素...
  • 今天,有粉丝想要了解更多爬取Json数据,存储Json数据,提取Json数据中信息的内容。因此,我接着发文给大家分享一波。 我今天随便找了一个腾讯视频的综艺节目作为例子来分享Json数据的爬取,存储,提取,还是一样...
  • 比如下面的案例是,取店铺名称接口返回数据如下:{"Code":0,"Msg":"ok","Data":{"StoreName":"小贝书屋","StoreLogo":"xkdnewyun/systemfile/images/100e478a75754c6f9237cd25e5874ca1.jpg","Contacts":"小贝书屋",...
  • Python对json数据的提取

    千次阅读 2021-01-04 14:33:31
    JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有...1,为什么要研究json数据的提取呢? 是因为z
  • JSON 数据结构、数据格式

    千次阅读 2019-06-02 15:09:40
    JSON的两种结构 JSON结构共有2种: 对象结构(无序): 无序的对象结构在不同语言中称法不同,比如在Python中称为字典,在JS中称为JSON对象……总之就是键/值对组合形式。刚才我转换出来的JSON结构就是无序的键/...
  • MyBatis-plus处理存储json数据

    千次阅读 2022-04-29 16:27:03
    mybatisPlus 处理对象和集合JSON格式
  • PostgreSQL JSON数据类型

    万次阅读 2019-06-22 18:03:15
    PostgreSQL JSON数据类型 本文我们学习PostgreSQL JSON数据类型,同时也介绍JSON数据类型的基本操作和函数。 概述 JSON 代表 JavaScript Object Notation。JSON是开放的标准格式,由key-value对组成。JSON的主要用于...
  • php如何解析JSON数据

    千次阅读 2021-05-15 12:54:00
    与XML一样,JSON是一种基于文本的格式,易于编写且易于理解,但与XML不同,JSON数据结构占用的带宽少于XML版本。JSON基于两个基本结构: 对象:被定义为键/值对的集合(即key:value),每个对象以左大括号“{”开头...
  • JSON三种数据解析方法

    万次阅读 多人点赞 2018-01-15 13:05:01
    引言 JSON数据现在是我们开发中用的最多的,百分之八十的数据都是通过JSON方式进行传输,那么想要学好JSON解析就要了解什么是JSON数据,怎么快速解析它从而提升开发效率。
  • VSCode使用插件美化json数据格式

    千次阅读 2022-04-02 15:07:09
    JSON Tools&Prettify Json&Pretty js/json
  • python读取json文件中的数据

    千次阅读 2022-02-11 17:26:50
    import json # 读取数据,我们的数据json格式的 data = [] with open("./data/arxiv-metadata-oai-snapshot.json", 'r') as f: for idx, line in enumerate(f): d = json.loads(line) d = {'authors': d['...
  • JSON数据导入SQL Server

    千次阅读 2020-07-17 17:39:30
    This article explores the process of JSON data import in the SQL Server table ... 本文探讨了使用T-SQL和SSIS在SQL Server表中导入JSON数据的过程。 介绍 (Introduction) Java Script Object Notation...
  • 使用python将Excel数据转换为json数据

    千次阅读 多人点赞 2020-12-04 18:05:40
    使用python将Excel数据转换为json数据 前段时间接触过将Excel数据装换为json数据的工作,今天做个记录,网上好像有工具可以直接转换,但是格式不能满足我的要求,后来自己就直接用python进行了数据转换。 话不多说,...
  • 在讲JSON之前,我觉得有必要先带大家了解一下XML(Extensible Markup Language 可扩展标记语言),因为JSON正在慢慢取代XML。 1、XML起源 早期Web发展和负载的数据量并不是很大,所以基本靠HTML(1989诞生)可以...
  • JS中json数据的处理

    万次阅读 2019-03-01 09:26:11
    下面在重点给大家介绍JS中json数据的处理: 1、 json数据结构(对象和数组) json对象:var obj = {"name":"xiao","age":12}; json数组:var objArray = [{"name":"xiao...
  • 文章目录 前言 一、pandas是什么? 二、使用步骤 1.... 2.读入数据 ...昨天开始接手一个小任务,说让我处理一个接口的查询返回数据,最开始的时候,我发现自己很傻逼,还想着自己写一个关于提交的方式,...下面我就...
  • Python pprint | 超级好用的Python库,漂亮的打印,让json数据提取体验更好
  • 详解通过JSON数据使用VUE.JS

    千次阅读 2021-01-17 13:49:30
    最近接到一个比较简单的项目,不准备使用数据库,打算用JSON数据就可以了。结合当前火热的VUE.JS进行数据渲染。尽管不打算使用数据库,可是一般的操作增删查改依旧是少不了的。如果使用到数据库的话,不妨做一个API...
  • 经过Deflater压缩和Base64编码之后的deFlaterStrokeJson.json文件,如下所示: 3.1.2 还原成原始的stroke.json数据 关压缩还不行,我们得使用压缩后的json文件数据啊,因此我们还需要将压缩后的json数据进行解压,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 450,064
精华内容 180,025
关键字:

下面哪个是json数据