Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Newtonsoft.Json -> System.Text.Json #126

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions example/SeqTail/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
using System.Reactive.Linq;
using Serilog.Formatting.Compact.Reader;
using System.Threading;
using Newtonsoft.Json.Linq;
using System.Text.Json;

const string usage = @"seq-tail: watch a Seq query from your console.

Expand Down Expand Up @@ -67,7 +67,7 @@ static async Task Run(string server, string? apiKey, string? filter, Cancellatio
strict = converted.StrictExpression;
}

using var stream = await connection.Events.StreamAsync<JObject>(filter: strict);
using var stream = await connection.Events.StreamAsync<JsonElement>(filter: strict);
var subscription = stream
.Select(LogEventReader.ReadFromJObject)
.Subscribe(Log.Write, cancel.Cancel);
Expand Down
2 changes: 1 addition & 1 deletion example/SeqTail/SeqTail.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

<ItemGroup>
<PackageReference Include="docopt.net" Version="0.8.1" />
<PackageReference Include="Serilog.Formatting.Compact.Reader" Version="2.0.0" />
<PackageReference Include="Serilog.Formatting.Compact.Reader" Version="3.0.0-dev-local" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="System.Reactive" Version="6.0.0" />
</ItemGroup>
Expand Down
36 changes: 17 additions & 19 deletions src/Seq.Api/Client/SeqApiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Text.Json;
using System.Text.Json.Serialization;
using Seq.Api.Model;
using Seq.Api.Model.Root;
using Seq.Api.Serialization;
Expand All @@ -45,13 +45,11 @@ public sealed class SeqApiClient : IDisposable
const string SeqApiV9MediaType = "application/vnd.datalust.seq.v9+json";

readonly CookieContainer _cookies = new();
readonly JsonSerializer _serializer = JsonSerializer.Create(
new JsonSerializerSettings
{
Converters = { new StringEnumConverter(), new LinkCollectionConverter() },
DateParseHandling = DateParseHandling.None,
FloatParseHandling = FloatParseHandling.Decimal
});
readonly JsonSerializerOptions _serializerOptions = new JsonSerializerOptions()
{
Converters = { new JsonStringEnumConverter(), new LinkCollectionConverter() },
NumberHandling = JsonNumberHandling.AllowReadingFromString,
};

/// <summary>
/// Construct a <see cref="SeqApiClient"/>.
Expand Down Expand Up @@ -217,7 +215,7 @@ public async Task<TResponse> PostAsync<TEntity, TResponse>(ILinked entity, strin
var linkUri = ResolveLink(entity, link, parameters);
var request = new HttpRequestMessage(HttpMethod.Post, linkUri) { Content = MakeJsonContent(content) };
var stream = await HttpSendAsync(request, cancellationToken).ConfigureAwait(false);
return _serializer.Deserialize<TResponse>(new JsonTextReader(new StreamReader(stream)));
return await JsonSerializer.DeserializeAsync<TResponse>(stream, _serializerOptions, cancellationToken);
}

/// <summary>
Expand Down Expand Up @@ -310,7 +308,7 @@ public async Task<TResponse> DeleteAsync<TEntity, TResponse>(ILinked entity, str
var linkUri = ResolveLink(entity, link, parameters);
var request = new HttpRequestMessage(HttpMethod.Delete, linkUri) { Content = MakeJsonContent(content) };
var stream = await HttpSendAsync(request, cancellationToken).ConfigureAwait(false);
return _serializer.Deserialize<TResponse>(new JsonTextReader(new StreamReader(stream)));
return await JsonSerializer.DeserializeAsync<TResponse>(stream, _serializerOptions, cancellationToken);
}

/// <summary>
Expand All @@ -324,7 +322,8 @@ public async Task<TResponse> DeleteAsync<TEntity, TResponse>(ILinked entity, str
/// <returns>A stream of values from the websocket.</returns>
public async Task<ObservableStream<TEntity>> StreamAsync<TEntity>(ILinked entity, string link, IDictionary<string, object> parameters = null, CancellationToken cancellationToken = default)
{
return await WebSocketStreamAsync(entity, link, parameters, reader => _serializer.Deserialize<TEntity>(new JsonTextReader(reader)), cancellationToken);
return await WebSocketStreamAsync(entity, link, parameters, stream =>
JsonSerializer.DeserializeAsync<TEntity>(stream, _serializerOptions).AsTask(), cancellationToken);
}

/// <summary>
Expand All @@ -337,10 +336,10 @@ public async Task<ObservableStream<TEntity>> StreamAsync<TEntity>(ILinked entity
/// <returns>A stream of raw messages from the websocket.</returns>
public async Task<ObservableStream<string>> StreamTextAsync(ILinked entity, string link, IDictionary<string, object> parameters = null, CancellationToken cancellationToken = default)
{
return await WebSocketStreamAsync(entity, link, parameters, reader => reader.ReadToEnd(), cancellationToken);
return await WebSocketStreamAsync(entity, link, parameters, stream => new StreamReader(stream).ReadToEndAsync(), cancellationToken);
}

async Task<ObservableStream<T>> WebSocketStreamAsync<T>(ILinked entity, string link, IDictionary<string, object> parameters, Func<TextReader, T> deserialize, CancellationToken cancellationToken = default)
async Task<ObservableStream<T>> WebSocketStreamAsync<T>(ILinked entity, string link, IDictionary<string, object> parameters, Func<Stream, Task<T>> deserialize, CancellationToken cancellationToken = default)
{
var linkUri = ResolveLink(entity, link, parameters);

Expand All @@ -358,7 +357,7 @@ async Task<T> HttpGetAsync<T>(string url, CancellationToken cancellationToken =
{
var request = new HttpRequestMessage(HttpMethod.Get, url);
var stream = await HttpSendAsync(request, cancellationToken).ConfigureAwait(false);
return _serializer.Deserialize<T>(new JsonTextReader(new StreamReader(stream)));
return await JsonSerializer.DeserializeAsync<T>(stream, _serializerOptions, cancellationToken);
}

async Task<string> HttpGetStringAsync(string url, CancellationToken cancellationToken = default)
Expand All @@ -380,7 +379,7 @@ async Task<Stream> HttpSendAsync(HttpRequestMessage request, CancellationToken c
Dictionary<string, object> payload = null;
try
{
payload = _serializer.Deserialize<Dictionary<string, object>>(new JsonTextReader(new StreamReader(stream)));
payload = await JsonSerializer.DeserializeAsync<Dictionary<string, object>>(stream, _serializerOptions, cancellationToken);
}
// ReSharper disable once EmptyGeneralCatchClause
catch { }
Expand All @@ -393,9 +392,8 @@ async Task<Stream> HttpSendAsync(HttpRequestMessage request, CancellationToken c

HttpContent MakeJsonContent(object content)
{
var json = new StringWriter();
_serializer.Serialize(json, content);
return new StringContent(json.ToString(), Encoding.UTF8, "application/json");
var jsonString = JsonSerializer.Serialize(content, _serializerOptions);
return new StringContent(jsonString, Encoding.UTF8, "application/json");
}

static string ResolveLink(ILinked entity, string link, IDictionary<string, object> parameters = null)
Expand Down
20 changes: 10 additions & 10 deletions src/Seq.Api/Model/AppInstances/AppInstanceEntity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using Seq.Api.Model.Apps;
using Seq.Api.Model.Inputs;
using Seq.Api.Model.Signals;
Expand Down Expand Up @@ -122,57 +122,57 @@ public AppInstanceEntity()
/// <summary>
/// Settings that control how events are ingested through the app.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public InputSettingsPart? InputSettings { get; set; }

/// <summary>
/// Metrics describing the state and activity of the app process.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public AppInstanceProcessMetricsPart? ProcessMetrics { get; set; }

/// <summary>
/// Information about ingestion activity through this app.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public InputMetricsPart? InputMetrics { get; set; }

/// <summary>
/// Information about the app's diagnostic input.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public InputMetricsPart? DiagnosticInputMetrics { get; set; }

/// <summary>
/// Information about events output through the app.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public AppInstanceOutputMetricsPart? OutputMetrics { get; set; }

/// <summary>
/// Obsolete.
/// </summary>
[Obsolete("Use !AcceptStreamedEvents instead.")]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public bool? IsManualInputOnly { get; set; }

/// <summary>
/// Obsolete.
/// </summary>
[Obsolete("Use !AcceptDirectInvocation instead.")]
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public bool? DisallowManualInput { get; set; }

/// <summary>
/// The name of the app.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string? AppName { get; set; }

/// <summary>
/// If <c>true</c>, then the app is able to write events to the log.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public bool? IsInput { get; set; }
}
}
18 changes: 9 additions & 9 deletions src/Seq.Api/Model/Data/QueryResultPart.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// limitations under the License.

using System.Collections.Generic;
using Newtonsoft.Json;
using System.Text.Json.Serialization;

namespace Seq.Api.Model.Data
{
Expand All @@ -37,49 +37,49 @@ public class QueryResultPart
/// <summary>
/// Result rows.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public object[][] Rows { get; set; }

/// <summary>
/// Result time slices.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public TimeSlicePart[] Slices { get; set; }

/// <summary>
/// Result timeseries.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public TimeseriesPart[] Series { get; set; }

/// <summary>
/// Result variables.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public Dictionary<string, object> Variables { get; set; }

/// <summary>
/// On error only, a description of the error.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string Error { get; set; }

/// <summary>
/// Reasons for the <see cref="Error"/>.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string[] Reasons { get; set; }

/// <summary>
/// A corrected version of the query, if one could be suggested.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public string Suggestion { get; set; }

/// <summary>
/// Execution statistics.
/// </summary>
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
public QueryExecutionStatisticsPart Statistics { get; set; }
}
}
8 changes: 4 additions & 4 deletions src/Seq.Api/Model/Entity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Seq.Api.Model
{
Expand Down Expand Up @@ -50,8 +50,8 @@ protected Entity()
/// <summary>
/// Facilitates backwards compatibility in the Seq server. Should not be used by consumers/clients.
/// </summary>
[JsonExtensionData, JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
[JsonExtensionData, JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
[Obsolete("Facilitates backwards compatibility in the Seq server. Should not be used by consumers/clients.")]
public Dictionary<string, JToken> ExtensionData { get; set; }
public Dictionary<string, JsonElement> ExtensionData { get; set; }
}
}
14 changes: 7 additions & 7 deletions src/Seq.Api/Model/Events/EventEntity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// limitations under the License.

using System.Collections.Generic;
using Newtonsoft.Json;
using System.Text.Json.Serialization;
using Seq.Api.Model.Shared;

// ReSharper disable UnusedAutoPropertyAccessor.Global
Expand Down Expand Up @@ -48,38 +48,38 @@ public class EventEntity : Entity
/// <summary>
/// A level associated with an event; <c>null</c> may indicate that the event is informational.
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Level { get; set; }

/// <summary>
/// An exception, stack trace/backtrace associated with the event.
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Exception { get; set; }

/// <summary>
/// If requested, a pre-rendered version of the templated event message.
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string RenderedMessage { get; set; }

/// <summary>
/// A trace id associated with the event, if any.
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string TraceId { get; set; }

/// <summary>
/// A span id associated with the event, if any.
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string SpanId { get; set; }

/// <summary>
/// A collection of properties describing the origin of the event, if any. These correspond to resource
/// attributes in the OpenTelemetry spec.
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public List<EventPropertyPart> Resource { get; set; }
}
}
10 changes: 5 additions & 5 deletions src/Seq.Api/Model/Events/MessageTemplateTokenPart.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

using Newtonsoft.Json;
using System.Text.Json.Serialization;

namespace Seq.Api.Model.Events
{
Expand All @@ -24,25 +24,25 @@ public class MessageTemplateTokenPart
/// <summary>
/// Plain text, if the token is a text token.
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Text { get; set; }

/// <summary>
/// The name of the property to be rendered in place of the token, if a property token.
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string PropertyName { get; set; }

/// <summary>
/// The raw source text from the message template (provided for both text and property tokens).
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string RawText { get; set; }

/// <summary>
/// A pre-formatted value, if the token carries language-specific formatting directives.
/// </summary>
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string FormattedValue { get; set; }
}
}
Loading