Serialization 将JSON反序列化为自定义HashMap<;字符串,google_firestore1::Value>;

Serialization 将JSON反序列化为自定义HashMap<;字符串,google_firestore1::Value>;,serialization,google-cloud-firestore,rust,hashmap,serde,Serialization,Google Cloud Firestore,Rust,Hashmap,Serde,我刚从Rust开始,在反序列化方面遇到了一些问题 实际上,我正在尝试使用下面的板条箱中的函数。我想填充结构文档的字段字段。结构的名称很清楚,它需要一个HashMap作为值 问题是,如何将JSON字符串反序列化为HashMap 以下是我目前编写的代码: extern板条箱google\u firestore1作为firestore1; 使用google_firestore1::Document; 使用std::collections::HashMap; 使用serde_json; pub fn g

我刚从Rust开始,在反序列化方面遇到了一些问题

实际上,我正在尝试使用下面的板条箱中的函数。我想填充结构
文档
的字段
字段
。结构的名称很清楚,它需要一个
HashMap
作为值

问题是,如何将JSON字符串反序列化为
HashMap

以下是我目前编写的代码:

extern板条箱google\u firestore1作为firestore1;
使用google_firestore1::Document;
使用std::collections::HashMap;
使用serde_json;
pub fn go(){
让_my_doc=Document::default();
let test=“{\“test\”:\“test\”,\“myarray\”:[1]}”;
//工作得很好
让_工作:HashMap=serde_json::from_str(test).unwrap();
//不起作用
让_不工作:HashMap=serde_json::from_str(test).unwrap();
//稍后我想做以下几点
//\u my\u doc.fields=\u不工作
}
Obvsiouly这不起作用,它崩溃了,出现以下错误

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("invalid type: string \"test\", expected struct Value", line: 1, column: 14)', src/firestore.rs:17:85
stack backtrace:
当然,我注意到
serde_json::Value
firestore1::Value
不是同一个结构。 但是我看了一下,似乎
firestore1::Value
正在实现反序列化特性

那么为什么它不起作用呢?在这种情况下,我是否需要迭代第一个HashMap并再次将
serde_json::Value
反序列化为
firestore1::Value
?有没有更干净的方法来做我想做的事


谢谢你的回答

firestore1::Value的定义是:

/// A message that can hold any of the supported value types.
/// 
/// This type is not used in any activity, and only used as *part* of another schema.
/// 
#[derive(Default, Clone, Debug, Serialize, Deserialize)]
pub struct Value {
    /// A bytes value.
    /// 
    /// Must not exceed 1 MiB - 89 bytes.
    /// Only the first 1,500 bytes are considered by queries.
    #[serde(rename="bytesValue")]
    pub bytes_value: Option<String>,
    /// A timestamp value.
    /// 
    /// Precise only to microseconds. When stored, any additional precision is
    /// rounded down.
    #[serde(rename="timestampValue")]
    pub timestamp_value: Option<String>,

    ...

}

这非常难看,因此如果您正在进行大量JSON到firestore的对话,我可能会编写一些帮助程序,将
serde_JSON::Value
转换为
firestore1::Value

它可能看起来像这样:

fn my_firestore_from_json(v:serde_json::Value) -> firestore1::Value {
  match v {
    serde_json::Value::Null => firestore::Value {
      // I don't know why this is a Option<String>
      null_value: Some("".to_string),
      ..Default::default(),
    },
    serde_json::Value::Bool(b) => firestore::Value {
      bool_value: Some(b),
      ..Default::default(),
    },
    // Implement this
    serde_json::Value::Number(n) => my_firestore_number(n),
    serde_json::Value::String(s) => firestore::Value {
      string_value: Some(s),
      ..Default::default(),
    },
    serde_json::Value::Array(v) => firestore::Value {
      array_value:
        Some(firestore1::ArrayValue{
            values:v.into_iter().map(my_firestore_from_json)
        }),
      ..Default::default(),
    },
    // Implement this
    serde_json::Value::Object(d) => my_firststore_object(/* something */) 
  }
}
fn my_firestore_from_json(v:serde_json::Value) -> firestore1::Value {
  match v {
    serde_json::Value::Null => firestore::Value {
      // I don't know why this is a Option<String>
      null_value: Some("".to_string),
      ..Default::default(),
    },
    serde_json::Value::Bool(b) => firestore::Value {
      bool_value: Some(b),
      ..Default::default(),
    },
    // Implement this
    serde_json::Value::Number(n) => my_firestore_number(n),
    serde_json::Value::String(s) => firestore::Value {
      string_value: Some(s),
      ..Default::default(),
    },
    serde_json::Value::Array(v) => firestore::Value {
      array_value:
        Some(firestore1::ArrayValue{
            values:v.into_iter().map(my_firestore_from_json)
        }),
      ..Default::default(),
    },
    // Implement this
    serde_json::Value::Object(d) => my_firststore_object(/* something */) 
  }
}
let test = "{\"test\":\"test\", \"myarray\": [1]}";
let working: HashMap<String, serde_json::Value> = serde_json::from_str(test).unwrap();
let value_map: HashMap<String, firestore1::Value> = working.iter().map(|(k,v)| (k, my_firestore_from_json(v)).collect();