有人很可能会指出这上面有一个复制品.但我已经找过了.关于这个问题有很多问题,但我似乎没有一个真正能帮上忙.

我交付的JSON(来自Elasticearch)的 struct 如下所示:

当我离开时:

let json_hashmap: HashMap<String, Value> = serde_json::from_str(&text).unwrap();

我明白了:

{
    "hits": Object {
        "hits": Array [
            Object {
                "_id": String("Ybgt6ooBpXznUptX4lR2"),
                "_index": String("booby"),
                "_score": Number(1.0),   
                ... (other keys)
            ],
            ... (multiple other hit-hit Objects in the Array)
         ],
         ... (other keys)
    }
    "key2": String("my arbitrary string value"),
    "key3": Number(1.0),
    ... (other keys)
}

这并不是说键和一组热门的"词典"是不可预测的.我可以为这些畅销词典想出struct分.但是,我如何才能真正获得热门点击数组呢?

因为可以看出,0级词典(外词典)具有一个关键字,该关键字被解码为包含内-内词典数组的内词典("1")("2").

但是,0级词典有"Hits"以外的关键字,这些关键字可以解码为其他值.并且实际上,级别1词典还可以具有除"HITS"之外的关键字.

有没有一种方法可以规定"0级"(外部)词典中的one particular key解码为HashMap<String, Value>,而该词典中的one particular key解码为Vec<MyStruct>

注意,如果我go ,我可以访问某个对象

let outer_hits = &json_hasmap["hits"];
let inner_hits = &outer_hits["hits"];

使用{:#?}打印此命令将显示以下内容:

Array [
    Object {
        "_id": String("Ybgt6ooBpXznUptX4lR2"),
        "_index": String("booby"),
        "_score": Number(1.0),
        "_source": Object {
            "docx_id": Number(14),
            "last_modif_ms": Number(1596958203000),
            "ldoc_type": String("docx_doc"),
            "path": String("D:\\My Documents\\doc\\IT_Diary\\IT Diary $UPD 2018-03.docx"),
        },
    },
    Object {
        ...

...但是,例如,尽管这被认为是类型Array,但是我try 的Go inner_hits.len()不能编译:我得到"^方法Not Found in &Value".奇怪的"数组".我怎样才能提取出更有用的东西?

最开始的text是:

{
  "_scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDnF1ZXJ5VGhlbkZldGNoBxZQcGUxbjhnQ1RzU0M1bG1ZR05od1VBAAAAAAAAASAWbkU3ck5YUTNSazZlazJtUXctSklWQRZQcGUxbjhnQ1RzU0M1bG1ZR05od1VBAAAAAAAAASEWbkU3ck5YUTNSazZlazJtUXctSklWQRZQcGUxbjhnQ1RzU0M1bG1ZR05od1VBAAAAAAAAASIWbkU3ck5YUTNSazZlazJtUXctSklWQRZQcGUxbjhnQ1RzU0M1bG1ZR05od1VBAAAAAAAAASMWbkU3ck5YUTNSazZlazJtUXctSklWQRZQcGUxbjhnQ1RzU0M1bG1ZR05od1VBAAAAAAAAASQWbkU3ck5YUTNSazZlazJtUXctSklWQRZQcGUxbjhnQ1RzU0M1bG1ZR05od1VBAAAAAAAAASUWbkU3ck5YUTNSazZlazJtUXctSklWQRZQcGUxbjhnQ1RzU0M1bG1ZR05od1VBAAAAAAAAASYWbkU3ck5YUTNSazZlazJtUXctSklWQQ==",
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 10,
    "successful": 10,
    "skipped": 3,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 5303,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "booby",
        "_id": "Ybgt6ooBpXznUptX4lR2",
        "_score": 1,
        "_source": {
          "docx_id": 14,
          "last_modif_ms": 1596958203000,
          "ldoc_type": "docx_doc",
          "path": "D:\\My Documents\\doc\\IT_Diary\\IT Diary $UPD 2018-03.docx"
        }
      },
      {
        "_index": "booby",
        "_id": "jLgt6ooBpXznUptX4lSG",
        "_score": 1,
        "_source": {
          "docx_id": 12,
          "last_modif_ms": 1596958248000,
          "ldoc_type": "docx_doc",
          "path": "D:\\My Documents\\doc\\IT_Diary\\IT Diary $UPD 2018-01.docx"
        }
      },
      {
        "_index": "booby",
        "_id": "1bgt6ooBpXznUptX4lSX",
        "_score": 1,
        "_source": {
          "docx_id": 20,
          "last_modif_ms": 1596958053000,
          "ldoc_type": "docx_doc",
          "path": "D:\\My Documents\\doc\\IT_Diary\\IT Diary $UPD 2018-09.docx"
        }
      },
      {
        "_index": "booby",
        "_id": "7rgt6ooBpXznUptX4lSm",
        "_score": 1,
        "_source": {
          "docx_id": 21,
          "last_modif_ms": 1596958032000,
          "ldoc_type": "docx_doc",
          "path": "D:\\My Documents\\doc\\IT_Diary\\IT Diary $UPD 2018-10.docx"
        }
      },
      {
        "_index": "booby",
        "_id": "_rgt6ooBpXznUptX4lS2",
        "_score": 1,
        "_source": {
          "docx_id": 22,
          "last_modif_ms": 1596957990000,
          "ldoc_type": "docx_doc",
          "path": "D:\\My Documents\\doc\\IT_Diary\\IT Diary $UPD 2018-11.docx"
        }
      }
    ]
  }
}

推荐答案

要从serde_json::Value中提取可用的类型(VecHashMap等),您可以对其进行模式匹配,也可以使用帮助器方法as_X()(例如as_array().unwrap().len()).

然而,使用serde时,使用类型化反序列化总是比使用泛型Value更好.这两种访问都更容易,反序列化也更快.

Rust相关问答推荐

如何访问Rust存储值的内存地址

如何装箱生命周期相关联的两个对象?

自定义结果枚举如何支持`?`/`FromResidual`?

是否可以使用Rust宏来构建元组的项?

Rust&;Tokio:如何处理更多的信号,而不仅仅是SIGINT,即SIGQUE?

习语选项<;T>;到选项<;U>;当T->;U用From定义

为什么我需要 to_string 函数的参考?

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

当我try 使用 SKI 演算中的S I I实现递归时,为什么 Rust 会失败?

信号量释放后 Rust 输出挂起线程

返回迭代器考虑静态生命周期类型

当没有实际结果时,如何在 Rust 中强制执行错误处理?

返回优化后的标题:返回异步块的闭包的类型擦除

为什么Rust中无法推断生命周期?

Rust 异步循环函数阻塞了其他future 任务的执行

返回引用字符串的future

使用 serde_json 进一步处理字段

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编

如何在 Rust 的内置函数上实现特征?