1616// under the License.
1717
1818//! Module for converting Variant data to JSON format
19-
2019use arrow_schema:: ArrowError ;
2120use base64:: { engine:: general_purpose, Engine as _} ;
2221use serde_json:: Value ;
@@ -86,14 +85,17 @@ fn write_decimal_i64(
8685 Ok ( ( ) )
8786}
8887
89- /// Converts a Variant to JSON and writes it to the provided `Write`
88+ /// Converts a Variant to JSON and writes it to the provided [ `Write`]
9089///
9190/// This function writes JSON directly to any type that implements [`Write`],
9291/// making it efficient for streaming or when you want to control the output destination.
9392///
93+ /// See [`variant_to_json_string`] for a convenience function that returns a
94+ /// JSON string.
95+ ///
9496/// # Arguments
9597///
96- /// * `json_buffer ` - Writer to output JSON to
98+ /// * `writer ` - Writer to output JSON to
9799/// * `variant` - The Variant value to convert
98100///
99101/// # Returns
@@ -103,23 +105,34 @@ fn write_decimal_i64(
103105///
104106/// # Examples
105107///
108+ ///
106109/// ```rust
107110/// # use parquet_variant::{Variant, variant_to_json};
108111/// # use arrow_schema::ArrowError;
109- /// let variant = Variant::Int32(42 );
112+ /// let variant = Variant::String("Hello, World!" );
110113/// let mut buffer = Vec::new();
111114/// variant_to_json(&mut buffer, &variant)?;
112- /// assert_eq!(String::from_utf8(buffer).unwrap(), "42 ");
115+ /// assert_eq!(String::from_utf8(buffer).unwrap(), "\"Hello, World!\" ");
113116/// # Ok::<(), ArrowError>(())
114117/// ```
115118///
119+ /// # Example: Create a [`Variant::Object`] and convert to JSON
116120/// ```rust
117- /// # use parquet_variant::{Variant, variant_to_json};
121+ /// # use parquet_variant::{Variant, VariantBuilder, variant_to_json};
118122/// # use arrow_schema::ArrowError;
119- /// let variant = Variant::String("Hello, World!");
120- /// let mut buffer = Vec::new();
121- /// variant_to_json(&mut buffer, &variant)?;
122- /// assert_eq!(String::from_utf8(buffer).unwrap(), "\"Hello, World!\"");
123+ /// let mut builder = VariantBuilder::new();
124+ /// // Create an object builder that will write fields to the object
125+ /// let mut object_builder = builder.new_object();
126+ /// object_builder.insert("first_name", "Jiaying");
127+ /// object_builder.insert("last_name", "Li");
128+ /// object_builder.finish();
129+ /// // Finish the builder to get the metadata and value
130+ /// let (metadata, value) = builder.finish();
131+ /// // Create the Variant and convert to JSON
132+ /// let variant = Variant::try_new(&metadata, &value)?;
133+ /// let mut writer = Vec::new();
134+ /// variant_to_json(&mut writer, &variant,)?;
135+ /// assert_eq!(br#"{"first_name":"Jiaying","last_name":"Li"}"#, writer.as_slice());
123136/// # Ok::<(), ArrowError>(())
124137/// ```
125138pub fn variant_to_json ( json_buffer : & mut impl Write , variant : & Variant ) -> Result < ( ) , ArrowError > {
@@ -243,10 +256,10 @@ fn convert_array_to_json(buffer: &mut impl Write, arr: &VariantList) -> Result<(
243256 Ok ( ( ) )
244257}
245258
246- /// Convert Variant to JSON string
259+ /// Convert [` Variant`] to JSON [`String`]
247260///
248261/// This is a convenience function that converts a Variant to a JSON string.
249- /// This is the same as calling variant_to_json with a Vec
262+ /// This is the same as calling [` variant_to_json`] with a [` Vec`].
250263/// It's the simplest way to get a JSON representation when you just need a String result.
251264///
252265/// # Arguments
@@ -269,15 +282,6 @@ fn convert_array_to_json(buffer: &mut impl Write, arr: &VariantList) -> Result<(
269282/// # Ok::<(), ArrowError>(())
270283/// ```
271284///
272- /// ```rust
273- /// # use parquet_variant::{Variant, variant_to_json_string};
274- /// # use arrow_schema::ArrowError;
275- /// let variant = Variant::String("Hello, World!");
276- /// let json = variant_to_json_string(&variant)?;
277- /// assert_eq!(json, "\"Hello, World!\"");
278- /// # Ok::<(), ArrowError>(())
279- /// ```
280- ///
281285/// # Example: Create a [`Variant::Object`] and convert to JSON
282286///
283287/// This example shows how to create an object with two fields and convert it to JSON:
@@ -302,8 +306,7 @@ fn convert_array_to_json(buffer: &mut impl Write, arr: &VariantList) -> Result<(
302306/// // Create the Variant and convert to JSON
303307/// let variant = Variant::try_new(&metadata, &value)?;
304308/// let json = variant_to_json_string(&variant)?;
305- /// assert!(json.contains("\"first_name\":\"Jiaying\""));
306- /// assert!(json.contains("\"last_name\":\"Li\""));
309+ /// assert_eq!(r#"{"first_name":"Jiaying","last_name":"Li"}"#, json);
307310/// # Ok::<(), ArrowError>(())
308311/// ```
309312pub fn variant_to_json_string ( variant : & Variant ) -> Result < String , ArrowError > {
@@ -313,7 +316,7 @@ pub fn variant_to_json_string(variant: &Variant) -> Result<String, ArrowError> {
313316 . map_err ( |e| ArrowError :: InvalidArgumentError ( format ! ( "UTF-8 conversion error: {}" , e) ) )
314317}
315318
316- /// Convert Variant to serde_json::Value
319+ /// Convert [` Variant`] to [` serde_json::Value`]
317320///
318321/// This function converts a Variant to a [`serde_json::Value`], which is useful
319322/// when you need to work with the JSON data programmatically or integrate with
@@ -334,16 +337,6 @@ pub fn variant_to_json_string(variant: &Variant) -> Result<String, ArrowError> {
334337/// # use parquet_variant::{Variant, variant_to_json_value};
335338/// # use serde_json::Value;
336339/// # use arrow_schema::ArrowError;
337- /// let variant = Variant::Int32(42);
338- /// let json_value = variant_to_json_value(&variant)?;
339- /// assert_eq!(json_value, Value::Number(42.into()));
340- /// # Ok::<(), ArrowError>(())
341- /// ```
342- ///
343- /// ```rust
344- /// # use parquet_variant::{Variant, variant_to_json_value};
345- /// # use serde_json::Value;
346- /// # use arrow_schema::ArrowError;
347340/// let variant = Variant::String("hello");
348341/// let json_value = variant_to_json_value(&variant)?;
349342/// assert_eq!(json_value, Value::String("hello".to_string()));
0 commit comments