Skip to content

Instantly share code, notes, and snippets.

@syntheticsh
Last active December 11, 2020 02:50
Show Gist options
  • Select an option

  • Save syntheticsh/3ce246c5bea8a10acb353fe57d8904e5 to your computer and use it in GitHub Desktop.

Select an option

Save syntheticsh/3ce246c5bea8a10acb353fe57d8904e5 to your computer and use it in GitHub Desktop.
{-# 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))
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(())
}
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