Guest User

Untitled

a guest
Nov 13th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. extern crate serde; // 1.0.80
  2. extern crate serde_json; // 1.0.32
  3. #[macro_use]
  4. extern crate serde_derive; // 1.0.80
  5.  
  6. use serde::de;
  7. use std::fmt;
  8.  
  9. #[derive(Debug, Default, PartialEq)]
  10. struct Outer {
  11. name: String,
  12. count: i64,
  13. key_string: String,
  14. key_object: Inner,
  15. }
  16.  
  17. #[derive(Debug, Default, PartialEq, Deserialize)]
  18. struct Inner {
  19. value: Option<String>,
  20. }
  21.  
  22. struct OuterVisitor;
  23.  
  24. impl<'de> de::Visitor<'de> for OuterVisitor {
  25. type Value = Outer;
  26.  
  27. fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
  28. write!(f, "an Outer struct")
  29. }
  30.  
  31. fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
  32. where
  33. A: de::MapAccess<'de>
  34. {
  35. let (mut name, mut count, mut key_string, mut key_object) = (None, None, None, None);
  36.  
  37. while let Some(key) = map.next_key::<String>()? {
  38. match key.as_ref() {
  39. "name" => name = Some(map.next_value::<String>()?),
  40. "count" => count = Some(map.next_value::<i64>()?),
  41. _ => {
  42. key_string = Some(key);
  43. key_object = Some(map.next_value::<Inner>()?);
  44. }
  45. }
  46. }
  47.  
  48. if name.is_none() {
  49. Err(de::Error::custom("missing field: 'name'"))
  50. } else if count.is_none() {
  51. Err(de::Error::custom("missing field: 'count'"))
  52. } else if key_string.is_none() || key_object.is_none() {
  53. Err(de::Error::custom("missing key or key object"))
  54. } else {
  55. Ok(Outer {
  56. name: name.unwrap(),
  57. count: count.unwrap(),
  58. key_string: key_string.unwrap(),
  59. key_object: key_object.unwrap(),
  60. })
  61. }
  62. }
  63. }
  64.  
  65. impl<'de> de::Deserialize<'de> for Outer {
  66. fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  67. where
  68. D: de::Deserializer<'de>,
  69. {
  70. deserializer.deserialize_map(OuterVisitor)
  71. }
  72. }
  73.  
  74. fn main() {
  75. let json = r#"
  76. {
  77. "name": "abc",
  78. "count": 123,
  79. "some-random-key": {
  80. "value": "foobar"
  81. }
  82. }
  83. "#;
  84.  
  85. let expected = Outer {
  86. name: "abc".to_string(),
  87. count: 123,
  88. key_string: "some-random-key".to_string(),
  89. key_object: Inner {
  90. value: Some("foobar".to_string()),
  91. },
  92. };
  93.  
  94. assert_eq!(serde_json::from_str::<Outer>(json).unwrap(), expected);
  95. }
Add Comment
Please, Sign In to add comment