
json数据仅仅只能用于展示display,如果用于条件查询,数据更新其效率是很低的,而且难于优化,不要尝试在json字段上进行查询优化。
虽然mysql57支持了json类型,但mysql作为关系型数据库,对标准化的column-per-value支持更好,包括数据类型限制、长度限制,唯一索引限制,查询索引优化,外键关联,关联查询支持,运算支持等,这些都是json中key无法达到的。
将常用的查询字段从json数据中剥离出来形成单独的字段,虽然可以改善查询问题,但你最好有先见之明,如果后期进行剥离就会涉及代码修改和数据迁移,遇到多版本的话,还可能出现数据冗余的问题,处理不好还会出现数据不一致问题,并不仅仅这么简单,一定慎用。
存储json的text类型性能并不乐观。
大JSON的解析性能同样不乐观,而且对于中文数据,纯JSON太占空间了。
「这个问题困扰我好久了,我经常分不清,今天刚好趁着这个机会,来总结下。」
1先看一下requests的源码:
「为了一探究竟,我们先看看源码里面怎么说的。」
不要看到英文就发怵,这东西最开始都是老外发明的。不要怕,跟着我一块硬着头皮啃就是了。
源码其实已经说的很明白了。对于data来说我们可以传入Dictionary, list of tuples, bytes, or file-like object ,对于json我们就只能传入json型的数据。
「切记:对于python字典和json虽然长得看起来一样,但是序列化格式还是有区别的。」 很多同学容易搞混淆,这个大家一定要记住。
看完源码,好像是理解了,好像又没有理解。怎么办,去网上找找有没有人详细分析过。
2来看看我搜索到的答案:
NO1
「为了加深对该知识点的理解,我也在网上做了一些搜索。」 我感觉说的挺不错的,摘录于此。
这个是通过提交请求的角度来说的,思路挺好。
NO2
「再来看下面这一条:」
>
JsonSchema官方文档
入门文档
入门文档
生成Schema工具
由于JSON Schema本身就是JSON,所以当一些东西是JSON Schema或者只是JSON的任意一块时,并不总是很容易分辨。该 schema设置schema所使用的参照标准。包含它通常是一种很好的做法,尽管不是必需的。
最佳做法是将$id属性包含为每个模式的唯一标识符。现在,只需将其设置为您控制的域中的URL,例如:
Type其实就是JSON数据的基本数据类型,一般是有6种,加上null一共有7种:
示例:
object类型有三个关键字:type(限定类型),properties(定义object的各个字段),required(限定必需字段)
这两个关键字的值都是非负整数。待校验的JSON对象中一级key的个数限制,minProperties指定了待校验的JSON对象可以接受的最少一级key的个数,maxProperties指定了待校验JSON对象可以接受的最多一级key的个数
正则表达式匹配json出现的属性,该JSON对象的每一个一级key都是一个正则表达式,用来匹配value值。
只有待校验JSON对象中的一级key,通过与之匹配的patternProperties中的一级正则表达式,对应的JSON Schema的校验,才算通过校验。例如,如果patternProperties对应的值如下:
在待校验JSON对象中,所有以S开头的key的value都必须是number,所有以I开头的一级key的value都必须是string。
示例:
array有三个单独的属性:items,minItems,uniqueItems:
该关键字的值是一个有效的JSON Schema或者一组有效的JSON Schema。
上面的JSON Schema的意思是,待校验JSON数组的元素都是string类型,且最小可接受长度是5。那么下面这个JSON数组明显是符合要求的,具体内容如下:
["myhome", "green"]
下面这个JSON数组明显不符合要求
["home", "green"]
当该关键字的值是一组有效的JSON Schema时,只有待校验JSON数组的所有元素通过items的值中对应位置上的JSON Schema的校验,那么,整个待校验JSON数组才算通过校验。
这里需要注意的是: 如果items定义的有效的JSON Schema的数量和待校验JSON数组中元素的数量不一致,那么就要采用“取小原则” 。
即,如果items定义了3个JSON Schema,但是待校验JSON数组只有2个元素,这时,只要待校验JSON数组的前两个元素能够分别通过items中的前两个JSON Schema的校验,那么,我们认为待校验JSON数组通过了校验。而,如果待校验JSON数组有4个元素,这时,只要待校验JSON数组的前三个元素能够通过items中对应的JSON Schema的校验,我们就认为待校验JSON数组通过了校验。
例如,如果items的值如下:
上面的JSON Schema指出了待校验JSON数组应该满足的条件,数组的第一个元素是string类型,且最小可接受长度为5,数组的第二个元素是number类型,最小可接受的值为10,数组的第三个元素是string类型。那么下面这两个JSON数组明显是符合要求的,具体内容如下:
["green", 10, "good"]
["helloworld", 11]
下面这两个JSON数组却是不符合要求的,具体内容如下:
["green", 9, "good"] //9小于minimum
["good", 12] //good小于minLength
该关键字的值是一个有效的JSON Schema。
需要注意的是, 该关键字只有在items关键字的值为一组有效的JSON Schema的时候,才可以使用,用于规定超出items中JSON Schema总数量之外的待校验JSON数组中的剩余的元素应该满足的校验逻辑 。只有这些剩余的所有元素都满足additionalItems的要求时,待校验JSON数组才算通过校验。
可以这么理解,当items的值为一组有效的JOSN Schema的时候,一般可以和additionalItems关键字组合使用,items用于规定对应位置上应该满足的校验逻辑,而additionalItems用于规定超出items校验范围的所有剩余元素应该满足的条件。如果二者同时存在,那么只有待校验JSON数组同时通过二者的校验,才算真正地通过校验。
另外,需要注意的是, 如果items只是一个有效的JSON Schema,那么就不能使用additionalItems ,原因也很简单,因为items为一个有效的JSON Schema的时候,其规定了待校验JSON数组所有元素应该满足的校验逻辑。additionalItems已经没有用武之地了。
强调一下,省略该关键字和该关键字的值为空JSON Schema,具有相同效果。
上面的JSON Schema的意思是,待校验JSON数组第一个元素是string类型,且可接受的最短长度为5个字符,第二个元素是number类型,且可接受的最小值为10,剩余的其他元素是string类型,且可接受的最短长度为2。
那么,下面三个JSON数组是能够通过校验的,具体内容如下:
["green", 10, "good"]
["green", 11]
["green", 10, "good", "ok"]
下面JSON数组是无法通过校验的,具体内容如下:
["green", 10, "a"]
["green", 10, "ok", 2]
这两个关键字的值都是非负整数。
指定了待校验JSON数组中元素的个数限制,minItems指定了待校验JSON数组可以接受的最少元素个数,而maxItems指定了待校验JSON数组可以接受的最多元素个数。
另外,需要注意的是,省略minItems关键字和该关键字的值为0,具有相同效果。而,如果省略maxItems关键字则表示对元素的最大个数没有限制。
例如,如果限制一个JSON数组的元素的最大个数为5,最小个数为1,则JSON Schema如下:
"minItems": 1,"maxItems": 5
该关键字的值是一个布尔值,即boolean(true、false)。
当该关键字的值为true时,只有待校验JSON数组中的所有元素都具有唯一性时,才能通过校验。当该关键字的值为false时,任何待校验JSON数组都能通过校验。
另外,需要注意的是,省略该关键字和该关键字的值为false时,具有相同的效果。例如:
"uniqueItems": true
注意:该关键字,官方说明中支持,但是,有可能你使用的平台或者第三方工具不支持。所以,使用需谨慎。
该关键字的值是一个有效的JSON Schema。
只有待校验JSON数组中至少有一个元素能够通过该关键字指定的JSON Schema的校验,整个数组才算通过校验。
另外,需要注意的是,省略该关键字和该关键字的值为空JSON Schema具有相同效果。
示例
format该关键字的值只能是以下取值:date-time(时间格式)、email(邮件格式)、hostname(网站地址格式)、ipv4、ipv6、uri、uri-reference、uri-template、json-pointer。
如果待校验的JSON元素正好是一个邮箱地址,那么,我们就可以使用format关键字进行校验,而不必通过pattern关键字指定复杂的正则表达式进行校验。
示例
integer和number的区别,integer相当于Java中的int类型,而number相当于Java中的int或float类型。
number 关键字可以描述任意长度,任意小数点的数字。
该关键字的值是一个大于0的number,即可以是大于0的int,也可以是大于0的float。
只有待校验的值能够被该关键字的值整除,才算通过校验。
如果含有该关键字的JSON Schema如下
{ "type": "integer", "multipleOf": 2 }
2、4、6都是可以通过校验的,但是,3、5、7都是无法通过校验的,当然了,20、40也是无法通过校验的,但是,并不是因为multipleOf关键字,而是因为type关键字。
如果含有multipleOf关键字的JSON Schema如下
{ "type": "number", "multipleOf": 20 }
2、20、4、40都是可以通过校验的,但是,3、30、3、30都是无法通过校验的。
另外,需要注意的是,省略该关键字则不对待校验数值进行该项校验。
该关键字的值是一个number,即可以是int,也可以是float。
该关键字规定了待校验元素可以通过校验的最大值。
省略该关键字,即表示对待校验元素的最大值没有要求
该关键字的值是一个boolean。
该关键字通常和maximum一起使用,当该关键字的值为true时,表示待校验元素必须小于maximum指定的值;当该关键字的值为false时,表示待校验元素可以小于或者等于maximum指定的值。
需要注意的是,省略该关键字和该关键字的值为false,具有相同效果。例如:
{ "type": "number", "maximum": 123, "exclusiveMaximum": true }
minimum、exclusiveMinimum关键字的用法和含义与maximum、exclusiveMaximum相似。唯一的区别在于,一个约束了待校验元素的最小值,一个约束了待校验元素的最大值。
对应着true或者false
该关键字的值是一个数组,该数组至少要有一个元素,且数组内的每一个元素都是唯一的。
如果待校验的JSON元素和数组中的某一个元素相同,则通过校验。否则,无法通过校验。
注意,该数组中的元素值可以是任何值,包括null。省略该关键字则表示无须对待校验元素进行该项校验。
该关键字的值可以是任何值,包括null。
如果待校验的JSON元素的值和该关键字指定的值相同,则通过校验。否则,无法通过校验。
省略该关键字则表示无须对待校验元素进行该项校验。
注意,该关键字部分第三方工具,并不支持
用来引用其他的schema
示例:
当一个schema写的很大的时候,可能需要创建内部结构体,再使用$ref进行引用,示列如下:
该关键字的值是一个非空数组,数组里面的每个元素都必须是一个有效的JSON Schema。
只有待校验JSON元素通过数组中所有的JSON Schema校验,才算真正通过校验。
意思是展示全部属性,建议用requires替代, 不建议使用 ,示例如下
该关键字的值是一个非空数组,数组里面的每个元素都必须是一个有效的JSON Schema。
如果待校验JSON元素能够通过数组中的任何一个JSON Schema校验,就算通过校验。
意思是展示任意属性,建议用requires替代和minProperties替代,示例如下:
该关键字的值是一个非空数组,数组里面的每个元素都必须是一个有效的JSON Schema。
如果待校验JSON元素能且只能通过数组中的某一个JSON Schema校验,才算真正通过校验。不能通过任何一个校验和能通过两个及以上的校验,都不算真正通过校验。
其中之一
该关键字的值是一个JSON Schema。
只有待校验JSON元素不能通过该关键字指定的JSON Schema校验的时候,待校验元素才算通过校验。
非 类型
需要特别注意的是,type关键字的值可以是一个string,也可以是一个数组。
如果type的值是一个string,则其值只能是以下几种:null、boolean、object、array、number、string、integer。
如果type的值是一个数组,则数组中的元素都必须是string,且其取值依旧被限定为以上几种。只要带校验JSON元素是其中的一种,则通过校验。
文件2:JsonValidateUtil
bak
其中ProcessingReport对象中维护了一迭代器,如果执行失败(执行成功时没有信息),其提供了一些高级故障信息。每个错误可能包含以下属性:
如果这是一次返回的json,那么你要分成3级显示,就需要分3级显示的不同点在那里
观察了你的json数据,json的字段都是相同的,因此想通过字段不同加以区别行不通,但是我看到你json字符串中有一个parentId,而且每一个的parentId都是不一样,我想你可以通过这个加以区分:
if(parentId == "1001"){ alert("学段") } if(parentId == "1002"){ alert("学科") } if(parentId == "1003"){ alert("版本") }
以上就是关于数据库存json 缺点全部的内容,包括:数据库存json 缺点、接口测试requests.post方法中data与json参数区别、JSON Schema入门等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)