使用serde_json解析JSON字符串

3
pub fn rust_server() -> redis::RedisResult<()> {
    println!("-> redis_server");
    let client = redis::Client::open(get_uri())?;
    let mut con = client.get_connection()?;

    println!("-> redis_server: {}", get_uri());

    println!("-> redis_server_pub_sub");
    let mut pub_sub = con.as_pubsub();

    println!("-> redis_server subscribe channels: {}", get_sub());
    pub_sub.subscribe(get_sub())?;

    loop {
        let msg = pub_sub.get_message()?;
        let payload: String = msg.get_payload()?;

        println!("{}", payload);
    }
}

我该如何使用serde_json解析以下类型为String的JSON负载?
let payload: String = msg.get_payload()?;

你是在问如何将类型为String(JSON?)的payload转换成允许你访问其值的东西吗? - undefined
如果有答案解决了你的问题,请点击绿色勾号将其标记为解决方案。 - undefined
2个回答

3

解决方案是使用serde_json::from_str,并且它有很好的文档:

use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct User {
    fingerprint: String,
    location: String,
}

fn main() {
    // The type of `j` is `&str`
    let j = "
        {
            \"fingerprint\": \"0xF9BA143B95FF6D82\",
            \"location\": \"Menlo Park, CA\"
        }";

    let u: User = serde_json::from_str(j).unwrap();
    println!("{:#?}", u);
}

不,这是针对str而不是String的。 - undefined
@自由职业顾问 你知道你也可以使用一个接受&strString的函数,只需添加一个引用即可。参见这个问题 - undefined
我不知道这个。那么as_str()有什么意义呢? - undefined
类型强制转换只在目标类型已知的情况下起作用,但并非总是如此。 - undefined

1

1
谢谢,这对我很有帮助,我已经搞定了 :) - undefined
@CrupsOS 没问题。如果问题已经得到解答,请将其标记为已解决。在将来,我强烈建议查看 crate 的文档 — 请参阅 https://docs.rs/serde_json/1.0.56/serde_json/。我对 serde_json 没有任何经验,但在文档中,解析 String 是首先列出的事项。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接