使用Rust中的引用创建结构

使用Rust中的引用创建结构,rust,Rust,我是新手,我一直在尝试用它来解决一些优化问题。我的目标是解析一个实例(在本例中是一个JSON字符串),其中包含有关问题实体的信息。解析实例后,我将读取一个包含所有不同类型实体的结构 在下面的代码中,我成功地读取了JSON字符串并遍历了一些实体。我尝试从实现trait,以便它可以从一个serde_json::Map转换为一个实体 使用serde_json::{Map,Value}; 使用std::{collections::HashSet}; #[派生(调试、PartialEq、Eq、散列)] 发

我是新手,我一直在尝试用它来解决一些优化问题。我的目标是解析一个实例(在本例中是一个JSON字符串),其中包含有关问题实体的信息。解析实例后,我将读取一个包含所有不同类型实体的结构

在下面的代码中,我成功地读取了JSON字符串并遍历了一些实体。我尝试从实现trait
,以便它可以从一个
serde_json::Map
转换为一个
实体

使用serde_json::{Map,Value};
使用std::{collections::HashSet};
#[派生(调试、PartialEq、Eq、散列)]
发布结构实体{
fn read_entities(json_entities:&Value)->HashSet{
让mut entities=HashSet::new();
如果json_entities.is_array(){
让array=json_entities.as_array().unwrap();
对于array.iter()中的项{
插入(实体::来自(项目));
}
}
实体
}
}
恳求{
fn from(对象:映射)->实体{
实体:哈希集数据{
设data=r#“{”Entities:[{“Field1”:0,“Field2”:“Abc”},{“Field1”:1,“Field2”:“Abc”}]};
让json:Value=serde_json::from_str(&data);
让mut entities=Entity::read_entities(&json[“entities”]);
资料{
实体,
}
}
}
fn main(){
让data=data::new();
}
我遇到了以下两个错误:

error[E0277]:trait绑定了`Entity
,因此编译器无法调用
Entity::from(项)
。但是,我不知道在这次调用中我应该在哪里通知
实体
的生存期
'a
。我觉得第二个错误是关于我应该在哪里放置生存期
'a
的类似问题。我已经与这两个错误斗争了一段时间,但我自己无法解决


如果您能指出任何东西都不是惯用语,我也会非常高兴。

发布的代码有很多问题,但主要归结为一个根本原因

如果您试图从代码中获得尽可能多的性能,那么为字段传递生命周期并使用
&str
是合适的。但在这种情况下,它会妨碍您,
枚举实际上包含一个
字符串,而不是
&str
,我相信这是因为JSON字符串转义规则

获取
哈希集的原因{
让mut entities=HashSet::new();
如果json_entities.is_array(){
让array=json_entities.as_array().unwrap();
对于array.iter()中的项{
插入(实体::来自(项目));
}
}
实体
}
}
实体的impl From{
fn from(对象:&值)->实体{
实体{
字段1:obj[“字段1”].as_u64().unwrap(),
字段2:obj[“字段2”].as_str().unwrap().to_string(),
}
}
}
#[导出(调试)]
发布结构数据{
实体:哈希集,
}
impl数据{
pub fn new()->数据{
设data=r#“{”Entities:[{“Field1”:0,“Field2”:“Abc”},{“Field1”:1,“Field2”:“Abc”}]};
让json:Value=serde_json::from_str(&data);
let entities=Entity::read_entities(&json[“entities”]);
数据{实体}
}
}
fn main(){
让data=data::new();
}

您可以在

上找到,我的理解是您的解决方案仅适用于字符串。最终,我希望在实体中有对结构的引用。字段2可以是对不同实体类型的引用。例如,我可以从JSON字符串中解析品牌和项目的列表,每个项目都有一个品牌的引用。在这种情况下,我应该如何进行?如果需要,我可以更新我的问题。
use serde_json::Value;
use std::collections::HashSet;

#[derive(Debug, PartialEq, Eq, Hash)]
pub struct Entity {
    field1: u64,
    field2: String,
}

impl Entity {
    fn read_entities(json_entities: &Value) -> HashSet<Entity> {
        let mut entities = HashSet::new();

        if json_entities.is_array() {
            let array = json_entities.as_array().unwrap();
            for item in array.iter() {
                entities.insert(Entity::from(item));
            }
        }

        entities
    }
}

impl From<&Value> for Entity {
    fn from(obj: &Value) -> Entity {
        Entity {
            field1: obj["Field1"].as_u64().unwrap(),
            field2: obj["Field2"].as_str().unwrap().to_string(),
        }
    }
}

#[derive(Debug)]
pub struct Data {
    entities: HashSet<Entity>,
}

impl Data {
    pub fn new() -> Data {
        let data = r#"{"Entities":[{"Field1":0,"Field2":"Abc"},{"Field1":1,"Field2":"Abc"}]}"#;
        let json: Value = serde_json::from_str(&data).expect("");
        let entities = Entity::read_entities(&json["Entities"]);
        Data { entities }
    }
}

fn main() {
    let data = Data::new();
}