Last active
December 11, 2020 02:50
-
-
Save syntheticsh/3ce246c5bea8a10acb353fe57d8904e5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| {-# LANGUAGE LambdaCase #-} | |
| {-# LANGUAGE OverloadedStrings #-} | |
| module Lib where | |
| import Control.Applicative | |
| import Data.Aeson | |
| import Data.ByteString.Lazy (ByteString) | |
| import Data.Vector (Vector) | |
| data GroupOrCamera | |
| = Group | |
| { _g_id :: String, | |
| _g_name :: String | |
| } | |
| | Camera | |
| { _c_id :: Int, | |
| _c_name :: String, | |
| _c_hls :: String, | |
| _c_realtime_hls :: String | |
| } | |
| deriving (Show) | |
| instance FromJSON GroupOrCamera where | |
| parseJSON (Object x) = | |
| x .: "OBJECT" | |
| >>= ( \case | |
| String "CAMERA" -> | |
| Camera <$> x .: "ID" <*> x .: "NAME" <*> x .: "HLS" <*> x .: "REALTIME_HLS" | |
| String "GROUP" -> Group <$> x .: "ID" <*> x .: "NAME" | |
| _ -> empty | |
| ) | |
| exampleJson :: ByteString | |
| exampleJson = "[{\"OBJECT\":\"CAMERA\",\"ID\":1773,\"NAME\":\"Домофон Челябинск, ул. Агалакова, д. 44, п. 1\",\"HLS\":\"/live/cam1773-master.m3u8\",\"REALTIME_HLS\":\"/live/cam1773-realtime-master.m3u8\"},{\"OBJECT\": \"GROUP\", \"ID\": \"433\", \"NAME\": \"Видeоконтроль\"}, {\"OBJECT\": \"GROUP\", \"ID\": \"436\", \"NAME\": \"Домофоны\"}]" | |
| main :: IO () | |
| main = print (decode exampleJson :: Maybe (Vector GroupOrCamera)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| use serde::Deserialize; | |
| #[derive(Deserialize, Debug)] | |
| #[serde(tag = "OBJECT")] | |
| enum GroupOrCamera { | |
| GROUP { | |
| ID: String, | |
| NAME: String, | |
| }, | |
| CAMERA { | |
| ID: i32, | |
| NAME: String, | |
| HLS: String, | |
| REALTIME_HLS: String, | |
| }, | |
| } | |
| fn main() -> Result<(), Box<dyn std::error::Error>> { | |
| let example_json = r#"[{"OBJECT":"CAMERA","ID":1773,"NAME":"Домофон Челябинск, ул. Агалакова, д. 44, п. 1","HLS":"/live/cam1773-master.m3u8","REALTIME_HLS":"/live/cam1773-realtime-master.m3u8"},{"OBJECT":"GROUP","ID":"433","NAME":"Видeоконтроль"},{"OBJECT":"GROUP","ID":"436","NAME":"Домофоны"}]"#; | |
| let res: std::vec::Vec<GroupOrCamera> = serde_json::from_str(example_json)?; | |
| println!("{:?}", res); | |
| Ok(()) | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import Foundation | |
| struct Camera: Decodable { | |
| let ID: Int | |
| let NAME: String | |
| let HLS: String | |
| let REALTIME_HLS: String | |
| } | |
| struct Group: Decodable { | |
| let ID: String | |
| let NAME: String | |
| } | |
| enum Object: String, Decodable { | |
| case CAMERA | |
| case GROUP | |
| case unknown | |
| init(from decoder: Decoder) throws { | |
| let container = try decoder.singleValueContainer() | |
| let OBJECT = try container.decode(String.self) | |
| self = Object(rawValue: OBJECT) ?? .unknown | |
| } | |
| } | |
| enum GroupOrCamera: Decodable { | |
| case Cam(Camera) | |
| case Gr(Group) | |
| case unknown | |
| enum CodingKeys: String, CodingKey { | |
| case OBJECT | |
| } | |
| init(from decoder: Decoder) throws { | |
| let container = try decoder.container(keyedBy: CodingKeys.self) | |
| guard let type = try? container.decode(Object.self, forKey: .OBJECT) else { | |
| self = .unknown | |
| return | |
| } | |
| let objectContainer = try decoder.singleValueContainer() | |
| switch type { | |
| case .CAMERA: | |
| let camera = try objectContainer.decode(Camera.self) | |
| self = .Cam(camera) | |
| case .GROUP: | |
| let group = try objectContainer.decode(Group.self) | |
| self = .Gr(group) | |
| case .unknown: | |
| self = .unknown | |
| } | |
| } | |
| } | |
| let example_json = """ | |
| [ | |
| { | |
| "OBJECT":"CAMERA", | |
| "ID":1773, | |
| "NAME":"Домофон Челябинск, ул. Агалакова, д. 44, п. 1", | |
| "HLS":"/live/cam1773-master.m3u8", | |
| "REALTIME_HLS":"/live/cam1773-realtime-master.m3u8" | |
| }, | |
| { | |
| "OBJECT":"GROUP", | |
| "ID":"433", | |
| "NAME":"Видeоконтроль" | |
| }, | |
| { | |
| "OBJECT":"GROUP", | |
| "ID":"436", | |
| "NAME":"Домофоны" | |
| } | |
| ] | |
| """.data(using: .utf8)!; | |
| let decoder = JSONDecoder() | |
| let items = try decoder.decode([GroupOrCamera].self, from: example_json) | |
| print(items) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment