@@ -19,6 +19,7 @@ use std::collections::BTreeMap;
1919use std:: collections:: VecDeque ;
2020use std:: str:: from_utf8;
2121use std:: str:: from_utf8_unchecked;
22+ use std:: str:: FromStr ;
2223
2324use crate :: builder:: ArrayBuilder ;
2425use crate :: builder:: ObjectBuilder ;
@@ -1420,6 +1421,130 @@ pub fn is_object(value: &[u8]) -> bool {
14201421 matches ! ( header & CONTAINER_HEADER_TYPE_MASK , OBJECT_CONTAINER_TAG )
14211422}
14221423
1424+ /// Convert `JSONB` value to `serde_json` Value
1425+ pub fn to_serde_json ( value : & [ u8 ] ) -> Result < serde_json:: Value , Error > {
1426+ if !is_jsonb ( value) {
1427+ let json_str = std:: str:: from_utf8 ( value) ?;
1428+ return match serde_json:: Value :: from_str ( json_str) {
1429+ Ok ( v) => Ok ( v) ,
1430+ Err ( _) => Err ( Error :: InvalidJson ) ,
1431+ } ;
1432+ }
1433+
1434+ containter_to_serde_json ( value)
1435+ }
1436+
1437+ /// Convert `JSONB` value to `serde_json` Object Value
1438+ pub fn to_serde_json_object (
1439+ value : & [ u8 ] ,
1440+ ) -> Result < Option < serde_json:: Map < String , serde_json:: Value > > , Error > {
1441+ if !is_jsonb ( value) {
1442+ let json_str = std:: str:: from_utf8 ( value) ?;
1443+ return match serde_json:: Value :: from_str ( json_str) {
1444+ Ok ( v) => match v {
1445+ serde_json:: Value :: Object ( obj) => Ok ( Some ( obj. clone ( ) ) ) ,
1446+ _ => Ok ( None ) ,
1447+ } ,
1448+ Err ( _) => Err ( Error :: InvalidJson ) ,
1449+ } ;
1450+ }
1451+
1452+ containter_to_serde_json_object ( value)
1453+ }
1454+
1455+ fn containter_to_serde_json_object (
1456+ value : & [ u8 ] ,
1457+ ) -> Result < Option < serde_json:: Map < String , serde_json:: Value > > , Error > {
1458+ let header = read_u32 ( value, 0 ) . unwrap_or_default ( ) ;
1459+ let length = ( header & CONTAINER_HEADER_LEN_MASK ) as usize ;
1460+
1461+ let obj_value = match header & CONTAINER_HEADER_TYPE_MASK {
1462+ OBJECT_CONTAINER_TAG => {
1463+ let mut obj = serde_json:: Map :: with_capacity ( length) ;
1464+ for ( key, jentry, val) in iterate_object_entries ( value, header) {
1465+ let item = scalar_to_serde_json ( jentry, val) ?;
1466+ obj. insert ( key. to_string ( ) , item) ;
1467+ }
1468+ Some ( obj)
1469+ }
1470+ ARRAY_CONTAINER_TAG | SCALAR_CONTAINER_TAG => None ,
1471+ _ => {
1472+ return Err ( Error :: InvalidJsonb ) ;
1473+ }
1474+ } ;
1475+ Ok ( obj_value)
1476+ }
1477+
1478+ fn containter_to_serde_json ( value : & [ u8 ] ) -> Result < serde_json:: Value , Error > {
1479+ let header = read_u32 ( value, 0 ) . unwrap_or_default ( ) ;
1480+ let length = ( header & CONTAINER_HEADER_LEN_MASK ) as usize ;
1481+
1482+ let json_value = match header & CONTAINER_HEADER_TYPE_MASK {
1483+ OBJECT_CONTAINER_TAG => {
1484+ let mut obj = serde_json:: Map :: with_capacity ( length) ;
1485+ for ( key, jentry, val) in iterate_object_entries ( value, header) {
1486+ let item = scalar_to_serde_json ( jentry, val) ?;
1487+ obj. insert ( key. to_string ( ) , item) ;
1488+ }
1489+ serde_json:: Value :: Object ( obj)
1490+ }
1491+ ARRAY_CONTAINER_TAG => {
1492+ let mut arr = Vec :: with_capacity ( length) ;
1493+ for ( jentry, val) in iterate_array ( value, header) {
1494+ let item = scalar_to_serde_json ( jentry, val) ?;
1495+ arr. push ( item) ;
1496+ }
1497+ serde_json:: Value :: Array ( arr)
1498+ }
1499+ SCALAR_CONTAINER_TAG => {
1500+ let encoded = match read_u32 ( value, 4 ) {
1501+ Ok ( encoded) => encoded,
1502+ Err ( _) => {
1503+ return Err ( Error :: InvalidJsonb ) ;
1504+ }
1505+ } ;
1506+ let jentry = JEntry :: decode_jentry ( encoded) ;
1507+ scalar_to_serde_json ( jentry, & value[ 8 ..] ) ?
1508+ }
1509+ _ => {
1510+ return Err ( Error :: InvalidJsonb ) ;
1511+ }
1512+ } ;
1513+ Ok ( json_value)
1514+ }
1515+
1516+ fn scalar_to_serde_json ( jentry : JEntry , value : & [ u8 ] ) -> Result < serde_json:: Value , Error > {
1517+ let json_value = match jentry. type_code {
1518+ NULL_TAG => serde_json:: Value :: Null ,
1519+ TRUE_TAG => serde_json:: Value :: Bool ( true ) ,
1520+ FALSE_TAG => serde_json:: Value :: Bool ( false ) ,
1521+ NUMBER_TAG => {
1522+ let len = jentry. length as usize ;
1523+ let n = Number :: decode ( & value[ ..len] ) ;
1524+ match n {
1525+ Number :: Int64 ( v) => serde_json:: Value :: Number ( serde_json:: Number :: from ( v) ) ,
1526+ Number :: UInt64 ( v) => serde_json:: Value :: Number ( serde_json:: Number :: from ( v) ) ,
1527+ Number :: Float64 ( v) => match serde_json:: Number :: from_f64 ( v) {
1528+ Some ( v) => serde_json:: Value :: Number ( v) ,
1529+ None => {
1530+ return Err ( Error :: InvalidJson ) ;
1531+ }
1532+ } ,
1533+ }
1534+ }
1535+ STRING_TAG => {
1536+ let len = jentry. length as usize ;
1537+ let s = unsafe { String :: from_utf8_unchecked ( value[ ..len] . to_vec ( ) ) } ;
1538+ serde_json:: Value :: String ( s)
1539+ }
1540+ CONTAINER_TAG => containter_to_serde_json ( value) ?,
1541+ _ => {
1542+ return Err ( Error :: InvalidJsonb ) ;
1543+ }
1544+ } ;
1545+ Ok ( json_value)
1546+ }
1547+
14231548/// Convert `JSONB` value to String
14241549pub fn to_string ( value : & [ u8 ] ) -> String {
14251550 if !is_jsonb ( value) {
@@ -1606,7 +1731,7 @@ fn scalar_to_string(
16061731 FALSE_TAG => json. push_str ( "false" ) ,
16071732 NUMBER_TAG => {
16081733 let num = Number :: decode ( & value[ * value_offset..* value_offset + length] ) ;
1609- json. push_str ( & format ! ( "{ num}" ) ) ;
1734+ json. push_str ( & num. to_string ( ) ) ;
16101735 }
16111736 STRING_TAG => {
16121737 escape_scalar_string ( value, * value_offset, * value_offset + length, json) ;
0 commit comments