Guest User

Untitled

a guest
Jun 21st, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. #[macro_use]
  2. extern crate serde_derive;
  3.  
  4. extern crate serde;
  5. extern crate serde_json;
  6.  
  7. use serde::{Deserialize, Deserializer};
  8.  
  9. fn main() {
  10. let s = r#" {"error":"a string"} "#;
  11. println!("{:?}", serde_json::from_str::<Response>(s).unwrap());
  12.  
  13. let s = r#" {"error":{"message":"not found","code":1}} "#;
  14. println!("{:?}", serde_json::from_str::<Response>(s).unwrap());
  15.  
  16. let s = r#" {"error":null} "#;
  17. println!("{:?}", serde_json::from_str::<Response>(s).unwrap());
  18. }
  19.  
  20. #[derive(Deserialize, Debug)]
  21. struct Response {
  22. #[serde(deserialize_with = "string_map_or_null")]
  23. error: Option<ResponseError>,
  24. }
  25.  
  26. #[derive(Deserialize, Debug)]
  27. struct ResponseError {
  28. code: i32,
  29. message: String,
  30. }
  31.  
  32. fn string_map_or_null<'de, D>(deserializer: D) -> Result<Option<ResponseError>, D::Error>
  33. where
  34. D: Deserializer<'de>,
  35. {
  36. #[derive(Deserialize, Debug)]
  37. #[serde(untagged)]
  38. enum Helper {
  39. Message(String),
  40. CodeMessage {
  41. code: i32,
  42. message: String,
  43. },
  44. Null,
  45. }
  46.  
  47. let helper = Helper::deserialize(deserializer)?;
  48. match helper {
  49. Helper::Message(s) => Ok(Some(ResponseError {
  50. code: -1,
  51. message: s,
  52. })),
  53. Helper::CodeMessage { code, message } => Ok(Some(ResponseError {
  54. code,
  55. message,
  56. })),
  57. Helper::Null => Ok(None),
  58. }
  59. }
Add Comment
Please, Sign In to add comment