Skip to content

Commit aa7429d

Browse files
committed
fix: Observe JsonSerializer options for JsonEventFormatter using Newtonsoft.Json
This is the Json.NET equivalent of #225. Note that not every option in JsonTextWriter is supported; in the future we could potentially introduce some alternative approach to provide more flexibility. Signed-off-by: Jon Skeet <[email protected]>
1 parent b67ac2b commit aa7429d

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/CloudNative.CloudEvents.NewtonsoftJson/JsonEventFormatter.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ public override ReadOnlyMemory<byte> EncodeStructuredModeMessage(CloudEvent clou
389389
};
390390

391391
var stream = new MemoryStream();
392-
var writer = new JsonTextWriter(new StreamWriter(stream));
392+
var writer = CreateJsonTextWriter(stream);
393393
WriteCloudEventForBatchOrStructuredMode(writer, cloudEvent);
394394
writer.Flush();
395395
return stream.ToArray();
@@ -406,7 +406,7 @@ public override ReadOnlyMemory<byte> EncodeBatchModeMessage(IEnumerable<CloudEve
406406
};
407407

408408
var stream = new MemoryStream();
409-
var writer = new JsonTextWriter(new StreamWriter(stream));
409+
var writer = CreateJsonTextWriter(stream);
410410
writer.WriteStartArray();
411411
foreach (var cloudEvent in cloudEvents)
412412
{
@@ -417,6 +417,20 @@ public override ReadOnlyMemory<byte> EncodeBatchModeMessage(IEnumerable<CloudEve
417417
return stream.ToArray();
418418
}
419419

420+
private JsonTextWriter CreateJsonTextWriter(Stream stream) =>
421+
// TODO: Allow settings to be specified separately?
422+
// JsonSerializer doesn't allow us to set the indentation or indentation character, for example.
423+
new JsonTextWriter(new StreamWriter(stream))
424+
{
425+
Formatting = Serializer.Formatting,
426+
DateFormatHandling = Serializer.DateFormatHandling,
427+
DateFormatString = Serializer.DateFormatString,
428+
DateTimeZoneHandling = Serializer.DateTimeZoneHandling,
429+
FloatFormatHandling = Serializer.FloatFormatHandling,
430+
Culture = Serializer.Culture,
431+
StringEscapeHandling = Serializer.StringEscapeHandling,
432+
};
433+
420434
private void WriteCloudEventForBatchOrStructuredMode(JsonWriter writer, CloudEvent cloudEvent)
421435
{
422436
Validation.CheckCloudEventArgument(cloudEvent, nameof(cloudEvent));

test/CloudNative.CloudEvents.UnitTests/NewtonsoftJson/JsonEventFormatterTest.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,6 +1080,18 @@ public void DecodeStructured_DefaultContentTypeToApplicationJson()
10801080
Assert.Equal("some text", jsonData.Value);
10811081
}
10821082

1083+
[Fact]
1084+
public void EncodeStructured_IndentationSettings()
1085+
{
1086+
var cloudEvent = new CloudEvent().PopulateRequiredAttributes();
1087+
var formatter = new JsonEventFormatter(new JsonSerializer { Formatting = Formatting.Indented });
1088+
var encoded = formatter.EncodeStructuredModeMessage(cloudEvent, out _);
1089+
// Normalize the result to LF line endings.
1090+
var json = BinaryDataUtilities.GetString(encoded, Encoding.UTF8).Replace("\r\n", "\n").Replace("\r", "\n");
1091+
var expected = "{\n \"specversion\": \"1.0\",\n \"id\": \"test-id\",\n \"source\": \"//test\",\n \"type\": \"test-type\"\n}";
1092+
Assert.Equal(expected, json);
1093+
}
1094+
10831095
// Utility methods
10841096
private static object? DecodeBinaryModeEventData(byte[] bytes, string contentType)
10851097
{

0 commit comments

Comments
 (0)