-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodeNameJsonSerializer.cs
More file actions
100 lines (82 loc) · 2.93 KB
/
CodeNameJsonSerializer.cs
File metadata and controls
100 lines (82 loc) · 2.93 KB
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#nullable enable
using System;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace CodeName.Serialization
{
public class CodeNameJsonSerializer : JsonSerializer, ISerializer
{
public string Serialize(object? value)
{
using var stringWriter = new StringWriter();
using var jsonWriter = new JsonTextWriter(stringWriter);
Serialize(jsonWriter, value);
return stringWriter.ToString();
}
public T? Deserialize<T>(string json)
{
using var textReader = new StringReader(json);
using var jsonReader = new JsonTextReader(textReader);
return Deserialize<T>(jsonReader);
}
public T? Deserialize<T>(JToken token)
{
using (var reader = token.CreateReader())
{
return Deserialize<T>(reader);
}
}
[return: NotNullIfNotNull("value")]
public T? Clone<T>(T? value)
{
if (value == null)
{
return default;
}
using (var stringReader = new StringReader(Serialize(value)))
using (var textReader = new JsonTextReader(stringReader))
{
return (T)Deserialize(textReader, value.GetType())!;
}
}
public T? PopulateWithConverter<T>(JToken token, T? value, bool requireConverter = true)
{
using (var reader = token.CreateReader())
{
return (T?)PopulateWithConverter(reader, value, typeof(T), requireConverter);
}
}
public T? PopulateWithConverter<T>(JsonReader reader, T? value, bool requireConverter = true)
{
return (T?)PopulateWithConverter(reader, value, typeof(T), requireConverter);
}
public object? PopulateWithConverter(JsonReader reader, object? value, Type objectType, bool requireConverter = true)
{
JsonConverter? matchedConverter = null;
foreach (var converter in Converters)
{
if (converter.CanConvert(objectType))
{
matchedConverter = converter;
break;
}
}
if (matchedConverter == null)
{
if (requireConverter)
{
throw new InvalidOperationException($"No matching converter was found for {objectType} and requireConverter is set to true (default)");
}
if (value == null)
{
throw new ArgumentException("Provided value was null and no matching converter was found");
}
Populate(reader, value);
return value;
}
return matchedConverter.ReadJson(reader, objectType, value, this);
}
}
}