Skip to content

Commit 08eec00

Browse files
authored
Merge pull request #157 from jamierushton/master
#47 Allow NULL and default values to be serialised
2 parents c1cc709 + df8db7a commit 08eec00

File tree

2 files changed

+59
-45
lines changed

2 files changed

+59
-45
lines changed

src/Exceptionless/Serializer/DefaultJsonSerializer.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ public class DefaultJsonSerializer : IJsonSerializer {
1616
public DefaultJsonSerializer() {
1717
_serializerSettings = new JsonSerializerSettings {
1818
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
19-
NullValueHandling = NullValueHandling.Ignore,
20-
DefaultValueHandling = DefaultValueHandling.Ignore,
2119
PreserveReferencesHandling = PreserveReferencesHandling.None,
2220
ContractResolver = new ExceptionlessContractResolver()
2321
};
@@ -73,7 +71,7 @@ private bool ShouldSerialize(JsonTextWriterWithDepth jw, JsonProperty property,
7371

7472
object value = property.ValueProvider.GetValue(obj);
7573
if (value == null)
76-
return false;
74+
return true;
7775

7876
if (typeof(ICollection).GetTypeInfo().IsAssignableFrom(property.PropertyType.GetTypeInfo())) {
7977
var collection = value as ICollection;

test/Exceptionless.Tests/Serializer/SerializerTests.cs

Lines changed: 58 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,6 @@ protected virtual IJsonSerializer GetSerializer() {
1515
return new DefaultJsonSerializer();
1616
}
1717

18-
[Fact]
19-
public void CanSerialize() {
20-
var data = new SampleModel {
21-
Date = DateTime.Now,
22-
Message = "Testing"
23-
};
24-
IJsonSerializer serializer = GetSerializer();
25-
string json = serializer.Serialize(data, new[] { "Date" });
26-
Assert.Equal(@"{""message"":""Testing""}", json);
27-
}
28-
2918
[Fact]
3019
public void CanSerializeEvent() {
3120
var ev = new Event {
@@ -34,36 +23,45 @@ public void CanSerializeEvent() {
3423
};
3524
ev.Data["FirstName"] = "Blake";
3625

26+
var exclusions = new[] { nameof(Event.Type), nameof(Event.Source), "Date", nameof(Event.Geo), nameof(Event.Count), nameof(Event.ReferenceId), nameof(Event.Tags), nameof(Event.Value) };
3727
IJsonSerializer serializer = GetSerializer();
38-
string json = serializer.Serialize(ev, new[] { "Date" });
28+
string json = serializer.Serialize(ev, exclusions);
3929
Assert.Equal(@"{""message"":""Testing"",""data"":{""FirstName"":""Blake""}}", json);
4030
}
4131

42-
4332
[Fact]
4433
public void CanExcludeProperties() {
4534
var data = new SampleModel {
4635
Date = DateTime.Now,
4736
Message = "Testing"
4837
};
4938
IJsonSerializer serializer = GetSerializer();
50-
string json = serializer.Serialize(data, new[] { "Date" });
39+
string json = serializer.Serialize(data, new[] { nameof(SampleModel.Date), nameof(SampleModel.Number), nameof(SampleModel.Bool), nameof(SampleModel.DateOffset), nameof(SampleModel.Collection), nameof(SampleModel.Dictionary), nameof(SampleModel.Nested) });
5140
Assert.Equal(@"{""message"":""Testing""}", json);
5241
}
5342

5443
[Fact]
5544
public void CanExcludeNestedProperties() {
56-
var data = new SampleModel {
57-
Date = DateTime.Now,
45+
var data = new NestedModel {
46+
Number = 1,
5847
Message = "Testing",
59-
Nested = new SampleModel {
60-
Date = DateTime.Now,
61-
Message = "Nested"
48+
Nested = new NestedModel {
49+
Message = "Nested",
50+
Number = 2
6251
}
6352
};
53+
54+
IJsonSerializer serializer = GetSerializer();
55+
string json = serializer.Serialize(data, new[] { nameof(NestedModel.Number) });
56+
Assert.Equal(@"{""message"":""Testing"",""nested"":{""message"":""Nested"",""nested"":null}}", json);
57+
}
58+
59+
[Fact]
60+
public void ShouldIncludeNullObjects() {
61+
var data = new DefaultsModel();
6462
IJsonSerializer serializer = GetSerializer();
65-
string json = serializer.Serialize(data, new[] { "Date" });
66-
Assert.Equal(@"{""message"":""Testing"",""nested"":{""message"":""Nested""}}", json);
63+
string json = serializer.Serialize(data);
64+
Assert.Equal(@"{""number"":0,""bool"":false,""message"":null,""collection"":null,""dictionary"":null}", json);
6765
}
6866

6967
[Fact]
@@ -87,44 +85,45 @@ public void CanExcludeMultiwordProperties() {
8785
}
8886

8987
[Fact]
90-
public void WillIgnoreDefaultValues() {
91-
var data = new SampleModel {
92-
Number = 0,
93-
Bool = false
94-
};
88+
public void ShouldIncludeDefaultValues() {
89+
var data = new SampleModel();
9590
IJsonSerializer serializer = GetSerializer();
96-
string json = serializer.Serialize(data);
97-
Assert.Equal(@"{}", json);
91+
string json = serializer.Serialize(data, new []{ nameof(SampleModel.Date), nameof(SampleModel.DateOffset) });
92+
Assert.Equal(@"{""number"":0,""bool"":false,""message"":null,""dictionary"":null,""collection"":null,""nested"":null}", json);
9893
var model = serializer.Deserialize<SampleModel>(json);
9994
Assert.Equal(data.Number, model.Number);
10095
Assert.Equal(data.Bool, model.Bool);
96+
Assert.Equal(data.Message, model.Message);
97+
Assert.Equal(data.Collection, model.Collection);
98+
Assert.Equal(data.Dictionary, model.Dictionary);
99+
Assert.Equal(data.Nested, model.Nested);
101100
}
102101

103102
[Fact]
104103
public void CanSetMaxDepth() {
105-
var data = new SampleModel {
104+
var data = new NestedModel {
106105
Message = "Level 1",
107-
Nested = new SampleModel {
106+
Nested = new NestedModel {
108107
Message = "Level 2",
109-
Nested = new SampleModel {
108+
Nested = new NestedModel {
110109
Message = "Level 3"
111110
}
112111
}
113112
};
114113
IJsonSerializer serializer = GetSerializer();
115-
string json = serializer.Serialize(data, maxDepth: 2);
114+
string json = serializer.Serialize(data, new[] { nameof(NestedModel.Number) }, maxDepth: 2);
116115
Assert.Equal(@"{""message"":""Level 1"",""nested"":{""message"":""Level 2""}}", json);
117116
}
118117

119118
[Fact]
120119
public void WillIgnoreEmptyCollections() {
121-
var data = new SampleModel {
122-
Date = DateTime.Now,
120+
var data = new DefaultsModel {
123121
Message = "Testing",
124-
Collection = new Collection<string>()
122+
Collection = new Collection<string>(),
123+
Dictionary = new Dictionary<string, string>()
125124
};
126125
IJsonSerializer serializer = GetSerializer();
127-
string json = serializer.Serialize(data, new[] { "Date" });
126+
string json = serializer.Serialize(data, new[] { nameof(DefaultsModel.Bool), nameof(DefaultsModel.Number) });
128127
Assert.Equal(@"{""message"":""Testing""}", json);
129128
}
130129

@@ -158,21 +157,24 @@ public void WillSerializeDeepExceptionWithStackInformation() {
158157
try {
159158
try {
160159
throw new ArgumentException("This is the innermost argument exception", "wrongArg");
161-
} catch (Exception e1) {
160+
}
161+
catch (Exception e1) {
162162
throw new TargetInvocationException("Target invocation exception.", e1);
163163
}
164-
} catch (Exception e2) {
164+
}
165+
catch (Exception e2) {
165166
throw new TargetInvocationException("Outer Exception. This is some text of the outer exception.", e2);
166167
}
167-
} catch (Exception ex) {
168+
}
169+
catch (Exception ex) {
168170
var client = CreateClient();
169171
var error = ex.ToErrorModel(client);
170172
var ev = new Event();
171173
ev.Data[Event.KnownDataKeys.Error] = error;
172174

173175
IJsonSerializer serializer = GetSerializer();
174176
string json = serializer.Serialize(ev);
175-
177+
176178
Assert.Contains(String.Format("\"line_number\":{0}", error.Inner.Inner.StackTrace.Single().LineNumber), json);
177179
}
178180
}
@@ -193,17 +195,31 @@ public class Blah {
193195
public string BlahId { get; set; }
194196
}
195197

198+
public class NestedModel {
199+
public int Number { get; set; }
200+
public string Message { get; set; }
201+
public NestedModel Nested { get; set; }
202+
}
203+
196204
public class SampleModel {
197205
public int Number { get; set; }
198206
public bool Bool { get; set; }
199-
public string Message { get; set; }
200207
public DateTime Date { get; set; }
208+
public string Message { get; set; }
201209
public DateTimeOffset DateOffset { get; set; }
202210
public IDictionary<string, string> Dictionary { get; set; }
203-
public ICollection<string> Collection { get; set; }
211+
public ICollection<string> Collection { get; set; }
204212
public SampleModel Nested { get; set; }
205213
}
206214

215+
public class DefaultsModel {
216+
public int Number { get; set; }
217+
public bool Bool { get; set; }
218+
public string Message { get; set; }
219+
public ICollection<string> Collection { get; set; }
220+
public IDictionary<string, string> Dictionary { get; set; }
221+
}
222+
207223
public class User {
208224
public string FirstName { get; set; }
209225
public string LastName { get; set; }

0 commit comments

Comments
 (0)