【问题标题】:Deserialization of JSON reponse keeps quotation marks in StringsJSON响应的反序列化在字符串中保留引号
【发布时间】:2019-04-22 01:23:06
【问题描述】:

我正在使用 reqwest 查询 Google API:

let request_url = format!(
    "https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=*\
     &inputtype=textquery\
     &fields=formatted_address,name,place_id,types\
     &locationbias=circle:50@{},{}\
     &key=my-secret-key",
    lat, lng
);

let mut response = reqwest::get(&request_url).expect("pffff");

let gr: GoogleResponse = response.json::<GoogleResponse>().expect("geeez");

GoogleResponse 结构体定义为

#[derive(Debug, Serialize, Deserialize)]
pub struct DebugLog {
    pub line: Vec<String>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Candidate {
    pub formatted_address: String,
    pub name: String,
    pub place_id: String,
    pub types: Vec<String>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct GoogleResponse {
    pub candidates: Vec<Candidate>,
    pub debug_log: DebugLog,
    pub status: String,
}

这一切都会编译,我可以提出请求,但是我在String 字段中的结果包含原始"。应该是这样吗?

例如,当打印我得到的格式化地址之一时:

"result": "\"Street blabh blahab blahb\"",

当我真正想要的时候

"result": "Street blabh blahab blahb",

我做错了什么还是这是预期的行为?

【问题讨论】:

  • 以后,请提供一个正确的MCVE,在那里您以最小的方式描述您的问题,并让我们看看一些代码。

标签: json serialization rust serde rust-rocket


【解决方案1】:

我将尝试在这里提供一个简单的示例。

extern crate serde; // 1.0.80
extern crate serde_json; // 1.0.33

use serde_json::Value;

const JSON: &str = r#"{
  "name": "John Doe",
  "age": 43
}"#;

fn main() {
    let v: Value = serde_json::from_str(JSON).unwrap();
    println!("{} is {} years old", v["name"], v["age"]);
}

(playground)

会导致

“John Doe”今年 43 岁

原因是,v["name"] 不是String,而是Value(您可以通过添加let a: () = v["name"]; 行来检查,这将导致错误:expected (), found enum 'serde_json::Value')。

如果你想要一个&amp;str/String,你必须先用Value::as_str转换它。

如果您相应地更改println! 行:

println!("{} is {} years old", v["name"].as_str().unwrap(), v["age"]);

它会打印出来:

约翰·多伊 43 岁

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2023-03-23
    相关资源
    最近更新 更多