#serde-json #protobuf #deserialize #prost-types

anystruct

AnyStruct是一个Rust包,它提供了在JSON和Protocol Buffers (Proto)数据结构之间转换的特质。

1个不稳定版本

0.1.0 2023年4月30日

#1318数据结构

MIT 协议

9KB
96

AnyStruct包

AnyStruct是一个Rust包,它提供了在JSON和Protocol Buffers (Proto)数据结构之间转换的特质。具体来说,它提供了以下特质

  • IntoJSON:将来自prost_types包的Value结构体转换为serde_json::Value结构体。
  • IntoProto:将serde_json::Value结构体转换为来自prost_types包的Value结构体。
  • IntoJSONStruct:将来自prost_types包的Struct结构体转换为serde_json::Map结构体。
  • IntoProtoStruct:将serde_json::Map结构体转换为来自prost_types包的Struct结构体。

使用方法

要在Rust项目中使用AnyStruct,请在您的Cargo.toml文件中添加以下行

[dependencies]
anystruct = "0.1.0"

以下是将JSON字符串转换为Proto结构体的示例用法

use anystruct::{IntoProto, ProtoStruct};

let json_str = r#"{
    "name": "John Doe",
    "age": 42,
    "is_student": true,
    "grades": [80, 85, 90],
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA"
    }
}"#;

let json_value = serde_json::from_str(json_str).unwrap();
let proto_value = json_value.into_proto();
let proto_struct = ProtoStruct { fields: [("my_data".to_string(), proto_value)].iter().cloned().collect() };

以下是将Proto结构体转换为JSON字符串的示例用法

use anystruct::{IntoJSON, IntoJSONStruct};

let proto_value = prost_types::Value {
    kind: Some(prost_types::value::Kind::StructValue(prost_types::Struct {
        fields: [("name".to_string(), prost_types::Value {
            kind: Some(prost_types::value::Kind::StringValue("John Doe".to_string())),
        })].iter().cloned().collect(),
    })),
};
let json_value = proto_value.into_json();
let json_map = json_value.as_object().unwrap().clone();
let json_str = serde_json::to_string_pretty(&json_map).unwrap();

您还可以使用IntoProtoStructIntoJSONStruct特质在Structserde_json::Map结构体之间进行转换

let proto_struct = json_map.into_proto_struct();
let json_map2 = proto_struct.into_json_struct();

依赖

~3MB
~66K SLoC