|
| 1 | +module NewtonsoftJson |
| 2 | + |
| 3 | +open System.IO |
| 4 | +open System.Text |
| 5 | +open System.Threading.Tasks |
| 6 | +open Microsoft.IO |
| 7 | +open Newtonsoft.Json |
| 8 | +open Newtonsoft.Json.Serialization |
| 9 | +open Giraffe |
| 10 | + |
| 11 | +type Serializer |
| 12 | + (settings: JsonSerializerSettings, rmsManager: RecyclableMemoryStreamManager) |
| 13 | + = |
| 14 | + let serializer = JsonSerializer.Create settings |
| 15 | + let utf8EncodingWithoutBom = UTF8Encoding (false) |
| 16 | + |
| 17 | + static member DefaultSettings = |
| 18 | + JsonSerializerSettings ( |
| 19 | + ContractResolver = CamelCasePropertyNamesContractResolver () |
| 20 | + ) |
| 21 | + |
| 22 | + interface Json.ISerializer with |
| 23 | + member __.SerializeToString (x: 'T) = |
| 24 | + JsonConvert.SerializeObject (x, settings) |
| 25 | + |
| 26 | + member __.SerializeToBytes (x: 'T) = |
| 27 | + JsonConvert.SerializeObject (x, settings) |> Encoding.UTF8.GetBytes |
| 28 | + |
| 29 | + member __.SerializeToStreamAsync (x: 'T) (stream: Stream) = |
| 30 | + task { |
| 31 | + use memoryStream = |
| 32 | + rmsManager.GetStream ("giraffe-json-serialize-to-stream") |
| 33 | + |
| 34 | + use streamWriter = new StreamWriter (memoryStream, utf8EncodingWithoutBom) |
| 35 | + |
| 36 | + use jsonTextWriter = new JsonTextWriter (streamWriter) |
| 37 | + serializer.Serialize (jsonTextWriter, x) |
| 38 | + jsonTextWriter.Flush () |
| 39 | + memoryStream.Seek (0L, SeekOrigin.Begin) |> ignore |
| 40 | + do! memoryStream.CopyToAsync (stream, 65536) |
| 41 | + } |
| 42 | + :> Task |
| 43 | + |
| 44 | + member __.Deserialize<'T> (json: string) = |
| 45 | + JsonConvert.DeserializeObject<'T> (json, settings) |
| 46 | + |
| 47 | + member __.Deserialize<'T> (bytes: byte array) = |
| 48 | + let json = Encoding.UTF8.GetString bytes |
| 49 | + JsonConvert.DeserializeObject<'T> (json, settings) |
| 50 | + |
| 51 | + member __.DeserializeAsync<'T> (stream: Stream) = |
| 52 | + task { |
| 53 | + use memoryStream = rmsManager.GetStream ("giraffe-json-deserialize") |
| 54 | + |
| 55 | + do! stream.CopyToAsync (memoryStream) |
| 56 | + memoryStream.Seek (0L, SeekOrigin.Begin) |> ignore |
| 57 | + use streamReader = new StreamReader (memoryStream) |
| 58 | + use jsonTextReader = new JsonTextReader (streamReader) |
| 59 | + return serializer.Deserialize<'T> (jsonTextReader) |
| 60 | + } |
0 commit comments