public override Event Read(ref Utf8JsonReader reader, Type _, JsonSerializerOptions options) { if (JsonDocument.TryParseValue(ref reader, out var doc) && doc.RootElement.TryGetProperty(sTypePropertyName, out var typeProperty) && doc.RootElement.TryGetProperty(sDetailTypePropertyName, out var detailTypeProperty)) { var type = typeProperty.Deserialize <EventType>(options); var detailType = detailTypeProperty.GetString() ?? string.Empty; // Try to parse EventSet. if (!EventSet.TryFromKey((type, detailType), out var set)) { // Handle unknown `detail_type` events, but the `type` must be one of the four. set = type switch { EventType.Meta => EventSet.NewMeta(detailType, typeof(EventMeta)), EventType.Message => EventSet.NewMessage(detailType, typeof(EventMessage)), EventType.Notice => EventSet.NewNotice(detailType, typeof(EventNotice)), EventType.Request => EventSet.NewRequest(detailType, typeof(EventRequest)), // `type` is unknown, not supported yet. _ => throw new NotSupportedException( $"{nameof(EventType)} {typeProperty.GetRawText()} is not supported by {nameof(JsonEventConverter)}.") }; } var post = doc.Deserialize(set !.ClassType, options); if (post is Event ev) { return(ev); } } throw new JsonException(); }