不同点:
当一个 JSON 值被输入并且接着不做任何附加处理就输出时, json会输出和输入完全相同的文本,而jsonb 则不会保留语义上没有意义的细节(例如空格)。
在jsonb中数据会被按照底层 numeric类型的行为来打印。例如:
jsonb有包含测试功能,json没有平行功能。
一般原则是被包含的对象必须在结构和数据内容上匹配包含对象,这种匹配 可以是从包含对象中丢弃了不匹配的数组元素或者对象键值对之后成立。做包含匹配时数组元素的顺序是没有意义的,并且重复的数组元素实 际也只会考虑一次。
json:
jsonobject_keys // 返回json的键(多层只返回第一层),该函数不能用于纯数组.
json_array_elements // 提取转换纯数组元素
json_extract_path // _返回JSON值所指向的某个键元素(相当于 #> 操作符),该函数不能直接操作纯数组。
jsonb:
jsonb_object_keys
jsonb_array_elements
jsonb_extract_path
select json_object_keys (‘{
“goods”:[
{“id”: “676a13d3-0225-4431-b858-678c3cfeab74”, “weight”: “1”, “quantity”: “9999999”},
{“id”: “111a13d3-0225-4431-b858-678c3cfeab75”, “weight”: “2”, “quantity”: “33”}],
“quantity”: “10”
}’)
select json_array_elements (‘[
{“id”: “676a13d3-0225-4431-b858-678c3cfeab74”, “weight”: “1”, “quantity”: “9999999”},
{“id”: “111a13d3-0225-4431-b858-678c3cfeab75”, “weight”: “2”, “quantity”: “33”},
{“id”: “111a13d3-0225-4431-b858-678c3cfea999”, “weight”: “3”, “quantity”: “11”}
]’)
select * from json_array_elements (‘[
{“id”: “676a13d3-0225-4431-b858-678c3cfeab74”, “weight”: “1”, “quantity”: “9999999”},
{“id”: “111a13d3-0225-4431-b858-678c3cfeab75”, “weight”: “2”, “quantity”: “33”},
{“id”: “111a13d3-0225-4431-b858-678c3cfea999”, “weight”: “3”, “quantity”: “11”}
]’) as jae
where jae::jsonb->>’weight’ = ‘3’ 
-> 表示获取一个JSON数组元素,支持下标值(下标从0开始)、Key获取。->> 表示获取一个JSON对象字符串。
#> 表示获取指定路径的一个JSON对象,#>>表示获取指定路径的一个JSON对象的字符串。
