align with go json unmarshal (#1397)

This commit is contained in:
Boshi Lian
2023-09-07 13:04:58 -07:00
committed by GitHub
parent c0ff215f5a
commit a3321e03c7
3 changed files with 58 additions and 6 deletions

View File

@@ -99,7 +99,7 @@ namespace k8s.Models
protected bool Equals(ResourceQuantity other)
{
return Format == other?.Format && _unitlessValue.Equals(other._unitlessValue);
return _unitlessValue.Equals(other?._unitlessValue);
}
public override bool Equals(object obj)

View File

@@ -2,10 +2,24 @@ namespace k8s.Models
{
internal sealed class ResourceQuantityJsonConverter : JsonConverter<ResourceQuantity>
{
// https://github.com/kubernetes/apimachinery/blob/4b14f804a0babdcc58e695d72f77ad29f536511e/pkg/api/resource/quantity.go#L683
public override ResourceQuantity Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
switch (reader.TokenType)
{
case JsonTokenType.Null:
return new ResourceQuantity(null);
case JsonTokenType.Number:
if (reader.TryGetDouble(out var val))
{
return new ResourceQuantity(Convert.ToString(val));
}
return reader.GetDecimal();
default:
return new ResourceQuantity(reader.GetString());
}
}
public override void Write(Utf8JsonWriter writer, ResourceQuantity value, JsonSerializerOptions options)
{

View File

@@ -1,5 +1,6 @@
using k8s.Models;
using System;
using System.Collections.Generic;
using Xunit;
using static k8s.Models.ResourceQuantity.SuffixFormat;
@@ -200,7 +201,7 @@ namespace k8s.Tests
}
[Fact]
public void Serialize()
public void SerializeJson()
{
{
ResourceQuantity quantity = 12000;
@@ -209,10 +210,25 @@ namespace k8s.Tests
}
[Fact]
public void DeserializeYaml()
public void DeserializeJson()
{
var value = KubernetesYaml.Deserialize<ResourceQuantity>("\"1\"");
Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value);
// str
{
var value = KubernetesJson.Deserialize<Dictionary<string, ResourceQuantity>>(@"{""cpu"": ""1.1""}");
Assert.Equal(new ResourceQuantity(11, -1, DecimalSI), value["cpu"]);
}
// int
{
var value = KubernetesJson.Deserialize<Dictionary<string, ResourceQuantity>>(@"{""cpu"": 1}");
Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value["cpu"]);
}
// double
{
var value = KubernetesJson.Deserialize<Dictionary<string, ResourceQuantity>>(@"{""cpu"": 1.1}");
Assert.Equal(new ResourceQuantity(11, -1, DecimalSI), value["cpu"]);
}
}
[Fact]
@@ -221,5 +237,27 @@ namespace k8s.Tests
var value = KubernetesYaml.Serialize(new ResourceQuantity(1, -1, DecimalSI));
Assert.Equal("100m", value);
}
[Fact]
public void DeserializeYaml()
{
// str
{
var value = KubernetesYaml.Deserialize<ResourceQuantity>("\"1\"");
Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value);
}
// int
{
var value = KubernetesYaml.Deserialize<ResourceQuantity>("1");
Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value);
}
// double
{
var value = KubernetesYaml.Deserialize<ResourceQuantity>("1.1");
Assert.Equal(new ResourceQuantity(11, -1, DecimalSI), value);
}
}
}
}