es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Serde json value omite las propiedades en caso de ser None.

Dado el siguiente JsonValue:

let mut schema = json!({
    "level": "strict",
    "rule": {}
});

Donde insertaremos valores dinámicamente en este JsonValue:

let value: json!({
    "type": property.r#type,
    "minLength": property.minLength,
    "maxLength": property.maxLength,
    "enum": property.r#enum
});

schema["rule"]
    .as_object_mut()
    .unwrap()
    .insert(
        String::from(property.name), 
        value
    );

// Estructura para Property

#[derive(Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SchemaDocumentProperty {
    pub name: String,
    pub r#type: Option<string>,
    pub minLength: Option<u32>,
    pub maxLength: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub r#enum: Option<><string>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub items: Option<schemadocumentpropertyarray>,
}

La salida actual es la siguiente, donde minLength, maxLength y enum son None:

{
    "type": "string",
    "minLength": null,
    "maxLength": null,
    "enum": null
}

Mi salida deseada:

{
    "type": "string"
}

Quiero omitir todos los valores None de la macro JsonValue.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para omitir los valores nulos de la macro JsonValue, puedes utilizar el atributo serde_skip en los campos que podrían tener valores nulos. Por ejemplo, en la estructura SchemaDocumentProperty dada, los campos min_length, max_length, enum y items podrían tener valores nulos. Por lo tanto, puedes agregar el atributo #[serde(skip_serializing_if = "Option::is_none")] en estos campos para omitirlos si sus valores son None.

    Aquí te muestro cómo puedes modificar la estructura SchemaDocumentProperty:

    #[derive(Default, Serialize, Deserialize)]
    #[serde(rename_all = "camelCase")]
    pub struct SchemaDocumentProperty {
        pub name: String,
        pub r#type: Option<string>,
        #[serde(skip_serializing_if = "Option::is_none")]
        pub min_length: Option<u32>,
        #[serde(skip_serializing_if = "Option::is_none")]
        pub max_length: Option<u32>,
        #[serde(skip_serializing_if = "Option::is_none")]
        pub r#enum: Option<><string>>,
        #[serde(skip_serializing_if = "Option::is_none")]
        pub items: Option<schemadocumentpropertyarray>,
    }
    

    Ahora, cuando serialices una instancia de SchemaDocumentProperty, los campos nulos se omitirán.

    Por ejemplo, si tienes una instancia de SchemaDocumentProperty de la siguiente manera:

    let property = SchemaDocumentProperty {
        name: String::from("example"),
        r#type: Some(String::from("string")),
        min_length: None,
        max_length: None,
        r#enum: None,
        items: None,
    };
    

    Y si lo serializas a json con serde:

    let json_value = serde_json::to_value(&property)?;
    

    El valor de json_value resultante será:

    {
      "name": "example",
      "type": "string"
    }
    

    Como puedes ver, los campos nulos se omiten del json final.

Comments are closed.