forked from microsoft/fsharplu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWithFunctor.fs
73 lines (61 loc) · 4.03 KB
/
WithFunctor.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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
namespace Microsoft.FSharpLu.Json
open Newtonsoft.Json
open System.Runtime.CompilerServices
/// Functor used to create Json serialization helpers for specific serializer settings
/// Warning: Because this functor depends on type JsonSerializerSettings defined in
/// NewtonSoft.Json any calling assembly using this type will
/// also need to add a direct reference to NewtonSoft.Json.
type With< ^S when ^S : (static member settings : JsonSerializerSettings)
and ^S : (static member formatting : Formatting) > =
static member inline public formatting () =
(^S:(static member formatting : Formatting)())
/// Serialize an object to Json with the specified converter
static member inline public serialize (obj:^T) =
let settings = (^S:(static member settings : JsonSerializerSettings)())
let formatting = (^S:(static member formatting : Formatting)())
JsonConvert.SerializeObject(obj, formatting, settings)
/// Serialize an object to Json with the specified converter and save the result to a file
static member inline public serializeToFile file (obj:^T) =
let settings = (^S:(static member settings : JsonSerializerSettings)())
let formatting = (^S:(static member formatting : Formatting)())
let json = JsonConvert.SerializeObject(obj, formatting, settings)
System.IO.File.WriteAllText(file, json)
/// Serialize an object to Json with the specified converter and write the result to a stream
static member inline public serializeToStream (stream:System.IO.Stream) (obj:^T) =
let settings = (^S:(static member settings : JsonSerializerSettings)())
let formatting = (^S:(static member formatting : Formatting)())
let serializer = JsonSerializer.Create(settings)
serializer.Formatting <- formatting
// Leave stream open after writing
let DefaultStreamWriterEncoding = System.Text.UTF8Encoding.UTF8
let DefaultStreamWriterBufferSize = 1024
use streamWriter = new System.IO.StreamWriter(stream, DefaultStreamWriterEncoding, DefaultStreamWriterBufferSize, true)
use jsonTextWriter = new JsonTextWriter(streamWriter)
serializer.Serialize(jsonTextWriter, obj)
/// Deserialize a Json to an object of statically-resolved type ^T
static member inline public deserialize< ^T> json :^T =
let settings = (^S:(static member settings : JsonSerializerSettings)())
let formatting = (^S:(static member formatting : Formatting)())
JsonConvert.DeserializeObject< ^T>(json, settings)
/// Deserialize a stream to an object of statically-resolved type ^T
static member inline public deserializeStream< ^T> (stream:System.IO.Stream) =
let settings = (^S:(static member settings : JsonSerializerSettings)())
let serializer = JsonSerializer.Create(settings)
use streamReader = new System.IO.StreamReader(stream)
use jsonTextReader = new JsonTextReader(streamReader)
serializer.Deserialize< ^T>(jsonTextReader)
/// Read Json from a file and desrialized it to an object statically-resolved type ^T
static member inline deserializeFile< ^T> file :^T =
System.IO.File.ReadAllText file |> With< ^S>.deserialize
/// Try to deserialize a stream to an object statically-resolved type ^T
static member inline tryDeserializeStream< ^T> stream =
Helpers.tryCatchJsonSerializationException< ^T, System.IO.Stream> false (With< ^S>.deserializeStream) stream
|> Helpers.exceptionToString
/// Try to deserialize json to an object ostatically-resolved type ^T
static member inline tryDeserialize< ^T> json =
Helpers.tryCatchJsonSerializationException< ^T, string> false (With< ^S>.deserialize) json
|> Helpers.exceptionToString
/// Try to read Json from a file and desrialized it to an object statically-resolved type ^T
static member inline tryDeserializeFile< ^T> file =
Helpers.tryCatchJsonSerializationException< ^T, string> false (With< ^S>.deserializeFile) file
|> Helpers.exceptionToString