/// <summary> /// Given a single JSON-encoded event, parses the event envelope and returns a CloudEvent. /// </summary> /// <param name="binaryData"> Specifies the instance of <see cref="BinaryData"/>. </param> /// <returns> A <see cref="CloudEvent"/>. </returns> public static CloudEvent ToCloudEvent(this BinaryData binaryData) { // Deserialize JsonElement to single event, parse event envelope properties JsonDocument requestDocument = JsonDocument.Parse(binaryData.Bytes); CloudEventInternal cloudEventInternal = CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement); // Case where Data and Type are null - cannot pass null Type into CloudEvent constructor if (cloudEventInternal.Type == null) { cloudEventInternal.Type = ""; } CloudEvent cloudEvent = new CloudEvent( cloudEventInternal.Source, cloudEventInternal.Type) { Id = cloudEventInternal.Id, Time = cloudEventInternal.Time, DataBase64 = cloudEventInternal.DataBase64, DataSchema = cloudEventInternal.Dataschema, DataContentType = cloudEventInternal.Datacontenttype, Subject = cloudEventInternal.Subject, SerializedData = cloudEventInternal.Data }; if (cloudEventInternal.AdditionalProperties != null) { foreach (KeyValuePair <string, object> kvp in cloudEventInternal.AdditionalProperties) { cloudEvent.ExtensionAttributes.Add(kvp.Key, kvp.Value); } } return(cloudEvent); }
/// <summary> /// Given a single JSON-encoded event, parses the event envelope and returns a CloudEvent. /// </summary> /// <param name="binaryData"> Specifies the instance of <see cref="BinaryData"/>. </param> /// <returns> A <see cref="CloudEvent"/>. </returns> public static CloudEvent ToCloudEvent(this BinaryData binaryData) { // Deserialize JsonElement to single event, parse event envelope properties JsonDocument requestDocument = JsonDocument.Parse(binaryData.ToMemory()); CloudEventInternal cloudEventInternal = CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement); CloudEvent cloudEvent = new CloudEvent( cloudEventInternal.Id, cloudEventInternal.Source, cloudEventInternal.Type, cloudEventInternal.Time, cloudEventInternal.Dataschema, cloudEventInternal.Datacontenttype, cloudEventInternal.Subject, cloudEventInternal.Data, cloudEventInternal.DataBase64); if (cloudEventInternal.AdditionalProperties != null) { foreach (KeyValuePair <string, object> kvp in cloudEventInternal.AdditionalProperties) { cloudEvent.ExtensionAttributes.Add(kvp.Key, kvp.Value); } } return(cloudEvent); }
/// <summary> /// Given JSON-encoded events, parses the event envelope and returns an array of CloudEvents. /// </summary> /// <param name="requestContent"> The JSON-encoded representation of either a single event or an array or events, in the CloudEvent schema. </param> /// <returns> A list of <see cref="CloudEvent"/>. </returns> public static CloudEvent[] Parse(string requestContent) { List <CloudEventInternal> cloudEventsInternal = new List <CloudEventInternal>(); List <CloudEvent> cloudEvents = new List <CloudEvent>(); JsonDocument requestDocument = JsonDocument.Parse(requestContent); // Parse JsonElement into separate events, deserialize event envelope properties if (requestDocument.RootElement.ValueKind == JsonValueKind.Object) { cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement)); } else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array) { foreach (JsonElement property in requestDocument.RootElement.EnumerateArray()) { cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(property)); } } foreach (CloudEventInternal cloudEventInternal in cloudEventsInternal) { cloudEvents.Add(new CloudEvent(cloudEventInternal)); } return(cloudEvents.ToArray()); }
/// <summary> /// Given JSON-encoded events, parses the event envelope and returns an array of CloudEvents. /// </summary> /// <param name="requestContent"> The JSON-encoded representation of either a single event or an array or events, in the CloudEvent schema. </param> /// <returns> A list of <see cref="CloudEvent"/>. </returns> public static CloudEvent[] Parse(string requestContent) { List <CloudEventInternal> cloudEventsInternal = new List <CloudEventInternal>(); List <CloudEvent> cloudEvents = new List <CloudEvent>(); JsonDocument requestDocument = JsonDocument.Parse(requestContent); // Parse JsonElement into separate events, deserialize event envelope properties if (requestDocument.RootElement.ValueKind == JsonValueKind.Object) { cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement)); } else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array) { foreach (JsonElement property in requestDocument.RootElement.EnumerateArray()) { cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(property)); } } foreach (CloudEventInternal cloudEventInternal in cloudEventsInternal) { // Case where Data and Type are null - cannot pass null Type into CloudEvent constructor if (cloudEventInternal.Type == null) { cloudEventInternal.Type = ""; } CloudEvent cloudEvent = new CloudEvent( cloudEventInternal.Source, cloudEventInternal.Type) { Id = cloudEventInternal.Id, Time = cloudEventInternal.Time, DataBase64 = cloudEventInternal.DataBase64, DataSchema = cloudEventInternal.Dataschema, DataContentType = cloudEventInternal.Datacontenttype, Subject = cloudEventInternal.Subject, SerializedData = cloudEventInternal.Data }; if (cloudEventInternal.AdditionalProperties != null) { foreach (KeyValuePair <string, object> kvp in cloudEventInternal.AdditionalProperties) { cloudEvent.ExtensionAttributes.Add(kvp.Key, kvp.Value); } } cloudEvents.Add(cloudEvent); } return(cloudEvents.ToArray()); }
/// <summary> /// Given JSON-encoded events, parses the event envelope and returns an array of CloudEvents. /// </summary> /// <param name="requestContent"> The JSON-encoded representation of either a single event or an array or events, in the CloudEvent schema. </param> /// <returns> A list of <see cref="CloudEvent"/>. </returns> public static CloudEvent[] Parse(string requestContent) { List <CloudEventInternal> cloudEventsInternal = new List <CloudEventInternal>(); List <CloudEvent> cloudEvents = new List <CloudEvent>(); JsonDocument requestDocument = JsonDocument.Parse(requestContent); // Parse JsonElement into separate events, deserialize event envelope properties if (requestDocument.RootElement.ValueKind == JsonValueKind.Object) { cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement)); } else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array) { foreach (JsonElement property in requestDocument.RootElement.EnumerateArray()) { cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(property)); } } foreach (CloudEventInternal cloudEventInternal in cloudEventsInternal) { CloudEvent cloudEvent = new CloudEvent( cloudEventInternal.Id, cloudEventInternal.Source, cloudEventInternal.Type, cloudEventInternal.Time, cloudEventInternal.Dataschema, cloudEventInternal.Datacontenttype, cloudEventInternal.Subject, cloudEventInternal.Data, cloudEventInternal.DataBase64); if (cloudEventInternal.AdditionalProperties != null) { foreach (KeyValuePair <string, object> kvp in cloudEventInternal.AdditionalProperties) { cloudEvent.ExtensionAttributes.Add(kvp.Key, kvp.Value); } } cloudEvents.Add(cloudEvent); } return(cloudEvents.ToArray()); }
private static List <CloudEvent> DeserializeRequest(Request request) { var content = request.Content as Utf8JsonRequestContent; var stream = new MemoryStream(); content.WriteTo(stream, CancellationToken.None); stream.Position = 0; JsonDocument requestDocument = JsonDocument.Parse(stream); var cloudEvents = new List <CloudEvent>(); // Parse JsonElement into separate events, deserialize event envelope properties if (requestDocument.RootElement.ValueKind == JsonValueKind.Object) { cloudEvents.Add(new CloudEvent(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement))); } else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array) { foreach (JsonElement property in requestDocument.RootElement.EnumerateArray()) { cloudEvents.Add(new CloudEvent(CloudEventInternal.DeserializeCloudEventInternal(property))); } } return(cloudEvents); }
/// <summary> /// Given JSON-encoded events, parses the event envelope and returns an array of CloudEvents. /// </summary> /// <param name="requestContent"> The JSON-encoded representation of either a single event or an array or events, in the CloudEvent schema. </param> /// <returns> A list of <see cref="CloudEvent"/>. </returns> public static CloudEvent[] Parse(string requestContent) { Argument.AssertNotNull(requestContent, nameof(requestContent)); CloudEvent[] cloudEvents = null; JsonDocument requestDocument = JsonDocument.Parse(requestContent); // Parse JsonElement into separate events, deserialize event envelope properties if (requestDocument.RootElement.ValueKind == JsonValueKind.Object) { cloudEvents = new CloudEvent[1]; cloudEvents[0] = (new CloudEvent(CloudEventInternal.DeserializeCloudEventInternal(requestDocument.RootElement))); } else if (requestDocument.RootElement.ValueKind == JsonValueKind.Array) { cloudEvents = new CloudEvent[requestDocument.RootElement.GetArrayLength()]; int i = 0; foreach (JsonElement property in requestDocument.RootElement.EnumerateArray()) { cloudEvents[i++] = new CloudEvent(CloudEventInternal.DeserializeCloudEventInternal(property)); } } return(cloudEvents ?? Array.Empty <CloudEvent>()); }
private async Task <CloudEvent[]> DeserializeCloudEventsInternal(string requestContent, bool async, CancellationToken cancellationToken = default) { List <CloudEventInternal> cloudEventsInternal = new List <CloudEventInternal>(); List <CloudEvent> cloudEvents = new List <CloudEvent>(); // Deserialize raw JSON string into separate events, deserialize event envelope properties JsonDocument requestDocument = await ParseJsonToDocument(requestContent, async, cancellationToken).ConfigureAwait(false); foreach (JsonElement property in requestDocument.RootElement.EnumerateArray()) { cloudEventsInternal.Add(CloudEventInternal.DeserializeCloudEventInternal(property)); } // Deserialize 'Data' property from JsonElement for each event foreach (CloudEventInternal cloudEventInternal in cloudEventsInternal) { object cloudEventData = null; if (cloudEventInternal.DataBase64 != null) { cloudEventData = Convert.FromBase64String(cloudEventInternal.DataBase64); } else { JsonElement?dataElement = cloudEventInternal.Data; if (dataElement.HasValue && dataElement.Value.ValueKind != JsonValueKind.Null) { // Reserialize JsonElement to stream MemoryStream dataStream = SerializePayloadToStream(dataElement, cancellationToken); // First, let's attempt to find the mapping for the event type in the custom event mapping. if (_customEventTypeMappings.TryGetValue(cloudEventInternal.Type, out Type typeOfEventData)) { if (!TryGetPrimitiveFromJsonElement(dataElement.Value, out cloudEventData)) { if (async) { cloudEventData = await _dataSerializer.DeserializeAsync(dataStream, typeOfEventData, cancellationToken).ConfigureAwait(false); } else { cloudEventData = _dataSerializer.Deserialize(dataStream, typeOfEventData, cancellationToken); } } } // If a custom mapping doesn't exist, let's attempt to find the mapping for the deserialization function in the system event type mapping. else if (SystemEventTypeMappings.SystemEventDeserializers.TryGetValue(cloudEventInternal.Type, out Func <JsonElement, object> systemDeserializationFunction)) { cloudEventData = systemDeserializationFunction(dataElement.Value); } // If no custom mapping was added, either return a primitive/string, or an object wrapped as BinaryData else { // If event data is not a primitive/string, return as BinaryData if (!TryGetPrimitiveFromJsonElement(dataElement.Value, out cloudEventData)) { cloudEventData = BinaryData.FromStream(dataStream); } } } else // Event has null data { cloudEventData = null; cloudEventInternal.Type = ""; } } cloudEvents.Add(new CloudEvent( cloudEventInternal.Source, cloudEventInternal.Type) { Id = cloudEventInternal.Id, Data = cloudEventData, Time = cloudEventInternal.Time, DataSchema = cloudEventInternal.Dataschema, DataContentType = cloudEventInternal.Datacontenttype, Subject = cloudEventInternal.Subject }); } return(cloudEvents.ToArray()); }