在Rust中生成Json

前言

周末在家,没什么事,看到之前学习Rust时,当时想生成JSON,不管那个语言,在项目中使用JSON序列化和反序列化,都是必不可少的.在Rust中使用serdejson组件.
serde是Rust语言的序列化和反序列化框架,serdejson就是serde框架下json序列化和反序列话的组件.在官方文档介绍

1. 在toml文件引入serde和serdejson包

[dependencies]
# 引入serde组件
serde = { version = "1.0.192", features = ["derive"]}
# 引入serde json组件
serde_json = "1"

2. 测试代码

//引入serde
use serde::{Deserialize, Serialize};

//这一点和其他语言差不多,不过是用宏Serialize指定序列化
//Deserialize宏 指定反序列化
#[derive(Serialize, Deserialize, Debug)]
struct Person
{
    id: i32,
    name: &'static str,
}

fn main() {
    println!("Hello, world!");

    //序列化 将实体序列化为json字符串
    let person = Person { id: 20, name: "test string" };
    let ps = serde_json::to_string(&person).unwrap();    println!("serialize json:{:?}", pt);

    //反序列化 从json 字符串反序列化为实体
    let pt: Person = serde_json::from_str(&ps).unwrap();
    println!("deserialize person{:?}", pt);

    let pp1 = Person{ id: 20, name:""};
}

这样的代码,编译会不通过的.错误提示:

rust使用serdejson转json,编译错误

是因为Person中name定义的类型是有生命周期的.这里不应该用这个类型.

#[derive(Serialize, Deserialize, Debug)]
struct Person
{
    id: i32,
    name: String  //&'static str改为String
}

let person = Person { id: 20, name: "test string".to_string() }; //"test string"改为 "test string".to_string()

编译成功后,打印的效果:

rust使用serdejson转json,编译成功

serde文档上介绍说是没有反射和运行时的开销,这是因为Serialize和Deserialize在编译时在实体上实现了Serialize和Deserialize方法.这个可以通过cargo expand工具,查看生成宏

# 使用expan 将宏展开 输出到macor.rs
cargo expand > macro.rs

使用expan将宏展开输出到文件中

expand在Windows上输出到文件,在RustRover无法直接查看的,是因为在Windows上通过管道符输出到文件中,创建文件的编码格式,不是UTF-8,是UTF-16,所以想在RustRover查看该文件的话,就需要将macro.rs文件编码格式改为UTF-8.

#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2021::*;
#[macro_use]
extern crate std;
use serde::{Deserialize, Serialize};
struct Person {
    id: i32,
    name: String,
}
#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
const _: () = {
    #[allow(unused_extern_crates, clippy::useless_attribute)]
    extern crate serde as _serde;
    #[automatically_derived]
    //为Person实现serialize
    impl _serde::Serialize for Person {
        fn serialize<__S>(
            &self,
            __serializer: __S,
        ) -> _serde::__private::Result<__S::Ok, __S::Error>
        where
            __S: _serde::Serializer,
        {
            let mut __serde_state = _serde::Serializer::serialize_struct(
                __serializer,
                "Person",
                false as usize + 1 + 1,
            )?;
            _serde::ser::SerializeStruct::serialize_field(
                &mut __serde_state,
                "id",
                &self.id,
            )?;
            _serde::ser::SerializeStruct::serialize_field(
                &mut __serde_state,
                "name",
                &self.name,
            )?;
            _serde::ser::SerializeStruct::end(__serde_state)
        }
    }
};
#[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
const _: () = {
    #[allow(unused_extern_crates, clippy::useless_attribute)]
    extern crate serde as _serde;
    #[automatically_derived]
    //为Person实现deserialize
    impl<'de> _serde::Deserialize<'de> for Person {
        fn deserialize<__D>(
            __deserializer: __D,
        ) -> _serde::__private::Result<Self, __D::Error>
        where
            __D: _serde::Deserializer<'de>,
        {
            #[allow(non_camel_case_types)]
            #[doc(hidden)]
            enum __Field {
                __field0,
                __field1,
                __ignore,
            }
            #[doc(hidden)]
            struct __FieldVisitor;
            impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
                type Value = __Field;
                fn expecting(
                    &self,
                    __formatter: &mut _serde::__private::Formatter,
                ) -> _serde::__private::fmt::Result {
                    _serde::__private::Formatter::write_str(
                        __formatter,
                        "field identifier",
                    )
                }
                fn visit_u64<__E>(
                    self,
                    __value: u64,
                ) -> _serde::__private::Result<Self::Value, __E>
                where
                    __E: _serde::de::Error,
                {
                    match __value {
                        0u64 => _serde::__private::Ok(__Field::__field0),
                        1u64 => _serde::__private::Ok(__Field::__field1),
                        _ => _serde::__private::Ok(__Field::__ignore),
                    }
                }
                fn visit_str<__E>(
                    self,
                    __value: &str,
                ) -> _serde::__private::Result<Self::Value, __E>
                where
                    __E: _serde::de::Error,
                {
                    match __value {
                        "id" => _serde::__private::Ok(__Field::__field0),
                        "name" => _serde::__private::Ok(__Field::__field1),
                        _ => _serde::__private::Ok(__Field::__ignore),
                    }
                }
                fn visit_bytes<__E>(
                    self,
                    __value: &[u8],
                ) -> _serde::__private::Result<Self::Value, __E>
                where
                    __E: _serde::de::Error,
                {
                    match __value {
                        b"id" => _serde::__private::Ok(__Field::__field0),
                        b"name" => _serde::__private::Ok(__Field::__field1),
                        _ => _serde::__private::Ok(__Field::__ignore),
                    }
                }
            }
            impl<'de> _serde::Deserialize<'de> for __Field {
                #[inline]
                fn deserialize<__D>(
                    __deserializer: __D,
                ) -> _serde::__private::Result<Self, __D::Error>
                where
                    __D: _serde::Deserializer<'de>,
                {
                    _serde::Deserializer::deserialize_identifier(
                        __deserializer,
                        __FieldVisitor,
                    )
                }
            }
            #[doc(hidden)]
            struct __Visitor<'de> {
                marker: _serde::__private::PhantomData<Person>,
                lifetime: _serde::__private::PhantomData<&'de ()>,
            }
            impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
                type Value = Person;
                fn expecting(
                    &self,
                    __formatter: &mut _serde::__private::Formatter,
                ) -> _serde::__private::fmt::Result {
                    _serde::__private::Formatter::write_str(__formatter, "struct Person")
                }
                #[inline]
                fn visit_seq<__A>(
                    self,
                    mut __seq: __A,
                ) -> _serde::__private::Result<Self::Value, __A::Error>
                where
                    __A: _serde::de::SeqAccess<'de>,
                {
                    let __field0 = match _serde::de::SeqAccess::next_element::<
                        i32,
                    >(&mut __seq)? {
                        _serde::__private::Some(__value) => __value,
                        _serde::__private::None => {
                            return _serde::__private::Err(
                                _serde::de::Error::invalid_length(
                                    0usize,
                                    &"struct Person with 2 elements",
                                ),
                            );
                        }
                    };
                    let __field1 = match _serde::de::SeqAccess::next_element::<
                        String,
                    >(&mut __seq)? {
                        _serde::__private::Some(__value) => __value,
                        _serde::__private::None => {
                            return _serde::__private::Err(
                                _serde::de::Error::invalid_length(
                                    1usize,
                                    &"struct Person with 2 elements",
                                ),
                            );
                        }
                    };
                    _serde::__private::Ok(Person {
                        id: __field0,
                        name: __field1,
                    })
                }
                #[inline]
                fn visit_map<__A>(
                    self,
                    mut __map: __A,
                ) -> _serde::__private::Result<Self::Value, __A::Error>
                where
                    __A: _serde::de::MapAccess<'de>,
                {
                    let mut __field0: _serde::__private::Option<i32> = _serde::__private::None;
                    let mut __field1: _serde::__private::Option<String> = _serde::__private::None;
                    while let _serde::__private::Some(__key) = _serde::de::MapAccess::next_key::<
                        __Field,
                    >(&mut __map)? {
                        match __key {
                            __Field::__field0 => {
                                if _serde::__private::Option::is_some(&__field0) {
                                    return _serde::__private::Err(
                                        <__A::Error as _serde::de::Error>::duplicate_field("id"),
                                    );
                                }
                                __field0 = _serde::__private::Some(
                                    _serde::de::MapAccess::next_value::<i32>(&mut __map)?,
                                );
                            }
                            __Field::__field1 => {
                                if _serde::__private::Option::is_some(&__field1) {
                                    return _serde::__private::Err(
                                        <__A::Error as _serde::de::Error>::duplicate_field("name"),
                                    );
                                }
                                __field1 = _serde::__private::Some(
                                    _serde::de::MapAccess::next_value::<String>(&mut __map)?,
                                );
                            }
                            _ => {
                                let _ = _serde::de::MapAccess::next_value::<
                                    _serde::de::IgnoredAny,
                                >(&mut __map)?;
                            }
                        }
                    }
                    let __field0 = match __field0 {
                        _serde::__private::Some(__field0) => __field0,
                        _serde::__private::None => {
                            _serde::__private::de::missing_field("id")?
                        }
                    };
                    let __field1 = match __field1 {
                        _serde::__private::Some(__field1) => __field1,
                        _serde::__private::None => {
                            _serde::__private::de::missing_field("name")?
                        }
                    };
                    _serde::__private::Ok(Person {
                        id: __field0,
                        name: __field1,
                    })
                }
            }
            #[doc(hidden)]
            const FIELDS: &'static [&'static str] = &["id", "name"];
            _serde::Deserializer::deserialize_struct(
                __deserializer,
                "Person",
                FIELDS,
                __Visitor {
                    marker: _serde::__private::PhantomData::<Person>,
                    lifetime: _serde::__private::PhantomData,
                },
            )
        }
    }
};
#[automatically_derived]
impl ::core::fmt::Debug for Person {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(
            f,
            "Person",
            "id",
            &self.id,
            "name",
            &&self.name,
        )
    }
}
fn main() {
    {
        ::std::io::_print(format_args!("Hello, world!\n"));
    };
    let person = Person {
        id: 20,
        name: "test string".to_string(),
    };
    let json = serde_json::to_string(&person).unwrap();
    {
        ::std::io::_print(format_args!("serialize json:{0}\n", json));
    };
    let pt: Person = serde_json::from_str(&json).unwrap();
    {
        ::std::io::_print(format_args!("deserialize person:{0:?}\n", pt));
    };
}


秋风 2024-07-14