-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathBinaryDefense.JsonWrapper.Core.fs
44 lines (33 loc) · 1.31 KB
/
BinaryDefense.JsonWrapper.Core.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
namespace BinaryDefense.JsonWrapper.Core
open Newtonsoft.Json.Linq
open Newtonsoft.Json
open System
type IHaveJToken =
abstract member InnerData : JToken
module Attributes =
type MustExist() =
inherit Attribute()
type MissingJsonFieldException(fieldName : string, ?jtoken : JToken) =
inherit Exception(sprintf "Failed to find json key \"%s\" on JToken" fieldName )
member __.JsonFieldName = fieldName
member __.JToken = jtoken
module Converters =
type IHaveJTokenConverter() =
inherit JsonConverter()
override __.CanConvert t =
typeof<IHaveJToken>.IsAssignableFrom(t)
override __.WriteJson(writer, value, serializer) =
match value with
| :? IHaveJToken as it -> serializer.Serialize(writer, it.InnerData)
| _ -> InvalidCastException("Did not implement type IHaveJToken") |> raise
override __.ReadJson(reader, t, _existingValue, serializer) =
let jtoken = JToken.ReadFrom reader
let ctor = t.GetConstructor([|typeof<JToken>; typeof<JsonSerializer>|])
ctor.Invoke([|
jtoken
serializer
|])
let recommendedConverters : JsonConverter list = [
IHaveJTokenConverter ()
Newtonsoft.Json.FSharp.Idiomatic.OptionConverter()
]