Десериализация ответа JSON сохраняет кавычки в строках - PullRequest
0 голосов
/ 19 ноября 2018

Я запрашиваю 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 Ответ

0 голосов
/ 19 ноября 2018

Я постараюсь привести простой пример здесь.

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 года

...