【问题标题】:serder_json heserialize map with value being Number or boolean or Stringserder_json heserialize map,值为 Number 或 boolean 或 String
【发布时间】:2020-04-02 06:33:40
【问题描述】:

我一直在尝试反序列化包含一个对象的 JSON,该对象的值只能是字符串、布尔值或数字。

这里是我使用的代码:

use serde::{Deserialize, Serialize};
use serde_json::Number;
use std::collections::HashMap;

#[derive(Deserialize, Debug, Serialize, Clone)]
pub enum OtherValue {
  Bool(bool),
  Number(Number),
  Text(String),
}

#[derive(Deserialize, Debug, Serialize)]
pub struct Item {
  numbers: HashMap<String, Number>,
  others: HashMap<String, OtherValue>,
}

如果你想尝试,这里是我设置的测试

#[cfg(test)]
mod tests {
  use super::*;

  #[test]
  fn test_deserialize_with_numbers() {
    let input_str = r#"
      {
        "numbers": {
          "key": 12.34
        },
        "others": {}
      }
    "#;
    let output = serde_json::from_str::<Item>(input_str).unwrap();
    assert_eq!(output.numbers.keys().len(), 1);
    assert_eq!(output.others.keys().len(), 0);
  }

  #[test]
  fn test_deserialize_with_strings() {
    let input_str = r#"
      {
        "numbers": {
          "key": "trololo"
        },
        "others": {}
      }
    "#;
    let output = serde_json::from_str::<Item>(input_str);
    assert_eq!(output.is_err(), true);
  }

  #[test]
  fn test_deserialize_with_boolean_field() {
    let input_str = r#"
      {
        "numbers": {
          "key": true
        },
        "others": {}
      }
    "#;
    let output = serde_json::from_str::<Item>(input_str);
    assert_eq!(output.is_err(), true);
  }

  #[test]
  fn test_deserialize_with_array_field() {
    let input_str = r#"
      {
        "numbers": {
          "key": ["trollo", true, 42]
        },
        "others": {}
      }
    "#;
    let output = serde_json::from_str::<Item>(input_str);
    assert_eq!(output.is_err(), true);
  }

  #[test]
  fn test_deserialize_with_number_tag() {
    let input_str = r#"
      {
        "others": {
          "key": 42
        },
        "numbers": {}
      }
    "#;
    let output = serde_json::from_str::<Item>(input_str).unwrap();
    assert_eq!(output.others.contains_key("key"), true);
  }

  #[test]
  fn test_deserialize_with_string_tag() {
    let input_str = r#"
      {
        "others": {
          "key": "trololo"
        },
        "numbers": {}
      }
    "#;
    let output = serde_json::from_str::<Item>(input_str).unwrap();
    assert_eq!(output.others.contains_key("key"), true);
  }

  #[test]
  fn test_deserialize_with_boolean_tag() {
    let input_str = r#"
      {
        "others": {
          "key": true
        },
        "numbers": {}
      }
    "#;
    let output = serde_json::from_str::<Item>(input_str).unwrap();
    assert_eq!(output.others.contains_key("key"), true);
  }
}

但显然这不能正常工作,我无法反序列化 OtherValue

你知道我该怎么做吗?

如果你想试试这里是一个游乐场https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=67b43cfd4d12efc6641f5b7fba02889a

【问题讨论】:

标签: json rust serde serde-json


【解决方案1】:
猜你喜欢
  • 2011-04-07
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 2015-03-06
  • 2019-10-06
相关资源
最近更新 更多