Десериализация ответа JSON сохраняет кавычки в строках
Я запрашиваю API Google, используя reqwest:
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",
Я делаю что-то не так или это ожидаемое поведение?
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"]);
}
приведет к
"Джон Доу" 43 года
Причина в том, что v["name"]
это не String
, но Value
вместо этого (Вы можете проверить это, добавив строку let a: () = v["name"];
что приведет к ошибке: expected (), found enum 'serde_json::Value'
).
Если вы хотите &str
/ String
, вы должны сначала преобразовать его, используя Value::as_str
,
Если вы измените println!
строка соответственно:
println!("{} is {} years old", v["name"].as_str().unwrap(), v["age"]);
он распечатает:
Джону Доу 43 года