Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
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
6 changes: 4 additions & 2 deletions src/KubernetesClient.Aot/KubernetesClient.Aot.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
Expand Down Expand Up @@ -43,7 +43,9 @@
<Compile Include="..\KubernetesClient\Models\V1Patch.cs" />
<Compile Include="..\KubernetesClient\Models\V1PodTemplateSpec.cs" />
<Compile Include="..\KubernetesClient\Models\V1Status.cs" />

<Compile Include="..\KubernetesClient\KubernetesJson.cs" />
<Compile Include="..\KubernetesClient\SourceGenerationContext.cs" />
<Compile Include="..\KubernetesClient\Models\V1Status.ObjectView.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\KubernetesClient\ClientSets\ClientSet.cs" />
Expand Down
103 changes: 0 additions & 103 deletions src/KubernetesClient.Aot/KubernetesJson.cs

This file was deleted.

4 changes: 2 additions & 2 deletions src/KubernetesClient.Classic/KubernetesClient.Classic.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0;net48</TargetFrameworks>
Expand Down Expand Up @@ -49,7 +49,7 @@
<Compile Include="..\KubernetesClient\Models\V1PodTemplateSpec.cs" />
<Compile Include="..\KubernetesClient\Models\V1Status.cs" />
<Compile Include="..\KubernetesClient\Models\V1Status.ObjectView.cs" />

<Compile Include="..\KubernetesClient\SourceGenerationContext.cs" />
<Compile Include="..\KubernetesClient\KubeConfigModels\ClusterEndpoint.cs" />
<Compile Include="..\KubernetesClient\KubeConfigModels\Context.cs" />
<Compile Include="..\KubernetesClient\KubeConfigModels\ContextDetails.cs" />
Expand Down
55 changes: 35 additions & 20 deletions src/KubernetesClient/KubernetesJson.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
using System.Globalization;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization.Metadata;
using System.Text.RegularExpressions;
using System.Xml;

namespace k8s
{
public static class KubernetesJson
{
private static readonly JsonSerializerOptions JsonSerializerOptions = new JsonSerializerOptions();

private sealed class Iso8601TimeSpanConverter : JsonConverter<TimeSpan>
internal static readonly JsonSerializerOptions JsonSerializerOptions = new JsonSerializerOptions
{
#if K8S_AOT
// Uses Source Generated IJsonTypeInfoResolver
TypeInfoResolver = SourceGenerationContext.Default,
#else
// Uses Source Generated IJsonTypeInfoResolver when available and falls back to reflection
TypeInfoResolver = JsonTypeInfoResolver.Combine(SourceGenerationContext.Default, new DefaultJsonTypeInfoResolver()),
#endif
};

internal sealed class Iso8601TimeSpanConverter : JsonConverter<TimeSpan>
{
public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
Expand All @@ -24,7 +34,7 @@ public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializer
}
}

private sealed class KubernetesDateTimeOffsetConverter : JsonConverter<DateTimeOffset>
internal sealed class KubernetesDateTimeOffsetConverter : JsonConverter<DateTimeOffset>
{
private const string RFC3339MicroFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.ffffffK";
private const string RFC3339NanoFormat = "yyyy-MM-dd'T'HH':'mm':'ss.fffffffK";
Expand Down Expand Up @@ -56,7 +66,7 @@ public override void Write(Utf8JsonWriter writer, DateTimeOffset value, JsonSeri
}
}

private sealed class KubernetesDateTimeConverter : JsonConverter<DateTime>
internal sealed class KubernetesDateTimeConverter : JsonConverter<DateTime>
{
private static readonly JsonConverter<DateTimeOffset> UtcConverter = new KubernetesDateTimeOffsetConverter();
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
Expand All @@ -72,13 +82,9 @@ public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializer

static KubernetesJson()
{
JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
JsonSerializerOptions.Converters.Add(new Iso8601TimeSpanConverter());
JsonSerializerOptions.Converters.Add(new KubernetesDateTimeConverter());
JsonSerializerOptions.Converters.Add(new KubernetesDateTimeOffsetConverter());
JsonSerializerOptions.Converters.Add(new V1Status.V1StatusObjectViewConverter());
#if !K8S_AOT
JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
#endif
}

/// <summary>
Expand All @@ -99,47 +105,56 @@ public static void AddJsonOptions(Action<JsonSerializerOptions> configure)

public static TValue Deserialize<TValue>(string json, JsonSerializerOptions jsonSerializerOptions = null)
{
return JsonSerializer.Deserialize<TValue>(json, jsonSerializerOptions ?? JsonSerializerOptions);
var info = (JsonTypeInfo<TValue>)(jsonSerializerOptions ?? JsonSerializerOptions).GetTypeInfo(typeof(TValue));
return JsonSerializer.Deserialize(json, info);
}

public static TValue Deserialize<TValue>(Stream json, JsonSerializerOptions jsonSerializerOptions = null)
{
return JsonSerializer.Deserialize<TValue>(json, jsonSerializerOptions ?? JsonSerializerOptions);
var info = (JsonTypeInfo<TValue>)(jsonSerializerOptions ?? JsonSerializerOptions).GetTypeInfo(typeof(TValue));
return JsonSerializer.Deserialize(json, info);
}

public static TValue Deserialize<TValue>(JsonDocument json, JsonSerializerOptions jsonSerializerOptions = null)
{
return JsonSerializer.Deserialize<TValue>(json, jsonSerializerOptions ?? JsonSerializerOptions);
var info = (JsonTypeInfo<TValue>)(jsonSerializerOptions ?? JsonSerializerOptions).GetTypeInfo(typeof(TValue));
return JsonSerializer.Deserialize(json, info);
}

public static TValue Deserialize<TValue>(JsonElement json, JsonSerializerOptions jsonSerializerOptions = null)
{
return JsonSerializer.Deserialize<TValue>(json, jsonSerializerOptions ?? JsonSerializerOptions);
var info = (JsonTypeInfo<TValue>)(jsonSerializerOptions ?? JsonSerializerOptions).GetTypeInfo(typeof(TValue));
return JsonSerializer.Deserialize(json, info);
}

public static TValue Deserialize<TValue>(JsonNode json, JsonSerializerOptions jsonSerializerOptions = null)
{
return JsonSerializer.Deserialize<TValue>(json, jsonSerializerOptions ?? JsonSerializerOptions);
var info = (JsonTypeInfo<TValue>)(jsonSerializerOptions ?? JsonSerializerOptions).GetTypeInfo(typeof(TValue));
return JsonSerializer.Deserialize(json, info);
}

public static string Serialize(object value, JsonSerializerOptions jsonSerializerOptions = null)
{
return JsonSerializer.Serialize(value, jsonSerializerOptions ?? JsonSerializerOptions);
var info = (jsonSerializerOptions ?? JsonSerializerOptions).GetTypeInfo(value.GetType());
return JsonSerializer.Serialize(value, info);
}

public static string Serialize(JsonDocument value, JsonSerializerOptions jsonSerializerOptions = null)
{
return JsonSerializer.Serialize(value, jsonSerializerOptions ?? JsonSerializerOptions);
var info = (jsonSerializerOptions ?? JsonSerializerOptions).GetTypeInfo(typeof(JsonDocument));
return JsonSerializer.Serialize(value, info);
}

public static string Serialize(JsonElement value, JsonSerializerOptions jsonSerializerOptions = null)
{
return JsonSerializer.Serialize(value, jsonSerializerOptions ?? JsonSerializerOptions);
var info = (jsonSerializerOptions ?? JsonSerializerOptions).GetTypeInfo(typeof(JsonElement));
return JsonSerializer.Serialize(value, info);
}

public static string Serialize(JsonNode value, JsonSerializerOptions jsonSerializerOptions = null)
{
return JsonSerializer.Serialize(value, jsonSerializerOptions ?? JsonSerializerOptions);
var info = (jsonSerializerOptions ?? JsonSerializerOptions).GetTypeInfo(typeof(JsonNode));
return JsonSerializer.Serialize(value, info);
}
}
}
6 changes: 4 additions & 2 deletions src/KubernetesClient/Models/V1Status.ObjectView.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using System.Text.Json.Serialization.Metadata;

namespace k8s.Models
{
public partial record V1Status
Expand All @@ -10,7 +12,7 @@ public override V1Status Read(ref Utf8JsonReader reader, Type typeToConvert, Jso

try
{
return obj.Deserialize<V1Status>();
return obj.Deserialize((JsonTypeInfo<V1Status>)options.GetTypeInfo(typeof(V1Status)));
}
catch (JsonException)
{
Expand All @@ -32,7 +34,7 @@ public override void Write(Utf8JsonWriter writer, V1Status value, JsonSerializer

public T ObjectView<T>()
{
return _original.Deserialize<T>();
return _original.Deserialize<T>((JsonTypeInfo<T>)KubernetesJson.JsonSerializerOptions.GetTypeInfo(typeof(T)));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ namespace k8s;
[JsonSourceGenerationOptions(
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
Converters = new[] { typeof(Iso8601TimeSpanConverter), typeof(KubernetesDateTimeConverter), typeof(KubernetesDateTimeOffsetConverter) })
Converters = new[] { typeof(Iso8601TimeSpanConverter), typeof(KubernetesDateTimeConverter), typeof(KubernetesDateTimeOffsetConverter), typeof(V1Status.V1StatusObjectViewConverter) })
]
internal partial class SourceGenerationContext : JsonSerializerContext
public partial class SourceGenerationContext : JsonSerializerContext
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@
// Code generated by https://github.com/kubernetes-client/csharp/tree/master/src/LibKubernetesGenerator
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
// </auto-generated>
#if NET8_0_OR_GREATER
namespace k8s
{
{{ for definition in definitions }}
[JsonSerializable(typeof({{ GetClassName definition }}))]
{{ end }}
internal partial class SourceGenerationContext : JsonSerializerContext
public partial class SourceGenerationContext : JsonSerializerContext
{
}
}
#endif