The other day I noticed when assigning an object to the Data
property of an Event Grid Schema message ✉️, any properties, on that object, that had a null
value were going to be ignored.
I thought my eyes 👀 were failing me! To test this, I wrote the following in LINQPad.
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 |
public const string EVENTGRID_TOPICKEY = "YOUR_EVENTGRID_TOPICKEY"; public const string EVENTGRID_TOPICENDPOINT = "YOUR_EVENTGRID_ENDPOINT"; async Task Main() { var topicCredentials = new TopicCredentials(EVENTGRID_TOPICKEY); var eventGridClient = new EventGridClient( topicCredentials); var eventGridEventList = new List<EventGridEvent>(); var eventGridEvent = new EventGridEvent() { Id = Guid.NewGuid().ToString(), Subject = "LINQPad.Test subject", EventType = "LINQPad.Test eventtype", Data = new Person { Id = Guid.NewGuid(), Name = $"name-{Guid.NewGuid()}", NickName = null }, EventTime = DateTime.UtcNow, DataVersion = "1" }; eventGridEventList.Add( eventGridEvent); await eventGridClient.PublishEventsAsync( new Uri(EVENTGRID_TOPICENDPOINT).Host, eventGridEventList); eventGridEvent.Dump(); } public class Person { [JsonProperty("id")] public Guid Id { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("nick_name")] public string NickName {get;set;} } |
For my Person
object I am setting NickName
to null
.
I created a simple Logic App, just composed of an HTTP Trigger, and made it a subscriber to my Event Grid topic.
I fired 🔥 off an Event Grid message ✉️ and inspected the Logic App to see what it received.
Needless to say, I was surprised 😲 to see that my nick_name
property had been dropped.
Just to be sure it wasn’t localized to the Logic App, I created another subscriber to the Event Grid topic that wrote the message ✉️ to a Storage Queue.
I fired 🔥 off another Event Grid message ✉️ and inspected my Storage Queue to see what it received.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "id": "bd2085b4-be74-4ed1-95eb-22d9c5527a83", "subject": "LINQPad.Test subject", "data": { "id": "0a44c2bc-3ec9-484f-9345-85a25e3894ee", "name": "name-e3b90ff5-4e99-4666-aa30-7df5a6094b13" }, "eventType": "LINQPad.Test eventtype", "eventTime": "2019-07-26T10:44:06.9076343Z", "dataVersion": "1", "metadataVersion": "1", "topic": "/subscriptions/SUBSCRIPTIONID/resourceGroups/RESOURCEGROUPNAME/providers/Microsoft.EventGrid/topics/EVENTGRIDTOPIC" } |
Again, my nick_name
property had been dropped!
Hmmm…
Now what’s interesting, is if I do the same thing, but send the message ✉️ to Azure Queue Storage, in include the null
property, probably because I am using Newtonsoft.Json
to serialize the Event Grid message ✉️.
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 |
public const string CLOUDSTORAGE_ENDPOINT = "YOUR_CLOUDSTORAGE_ENDPOINT "; async Task Main() { CloudStorageAccount storageAccount; if (CloudStorageAccount.TryParse(CLOUDSTORAGE_ENDPOINT, out storageAccount)) { var cloudQueueClient = storageAccount.CreateCloudQueueClient(); var cloudQueueReference = cloudQueueClient.GetQueueReference("events"); var eventGridEvent = new EventGridEvent() { Id = Guid.NewGuid().ToString(), Subject = "LINQPad.Test subject", EventType = "LINQPad.Test eventtype", Data = new Person { Id = Guid.NewGuid(), Name = $"name-{Guid.NewGuid()}", NickName = null }, EventTime = DateTime.UtcNow, DataVersion = "1" }; var cloudQueueMessage = new CloudQueueMessage(JsonConvert.SerializeObject(eventGridEvent, Newtonsoft.Json.Formatting.Indented)); await cloudQueueReference.AddMessageAsync(cloudQueueMessage); eventGridEvent.Dump(); } else { Console.WriteLine("A connection string has not been defined for CLOUDSTORAGE_ENDPOINT."); } } |
So maybe this is Event Grid specific? Not 100% 💯sure.
When supplying the sample JSON schema for my Logic App’s Parse JSON step, I had to make sure to include ALL my properties. Normally, I just pick off the JSON generated by the incoming Event Grid message ✉️ and just use that, but as I mentioned, it was dropping my null
properties.
Once I did that, all was well.
In closing, not saying this is a problem, just something that was unexpected.
Were I to use an Azure Function to read the Event Grid message ✉️, and then inside the Azure Function, convert the Data property to a dynamic
object, I would be missing any object properties set to null
.
Just something to be aware of, hopefully save a fellow developer a head scratch or two.
Discover more from Matt Ruma
Subscribe to get the latest posts sent to your email.