Skip to content

Commit a3321e0

Browse files
authored
align with go json unmarshal (#1397)
1 parent c0ff215 commit a3321e0

File tree

3 files changed

+58
-6
lines changed

3 files changed

+58
-6
lines changed

src/KubernetesClient.Models/ResourceQuantity.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public override string ToString()
9999

100100
protected bool Equals(ResourceQuantity other)
101101
{
102-
return Format == other?.Format && _unitlessValue.Equals(other._unitlessValue);
102+
return _unitlessValue.Equals(other?._unitlessValue);
103103
}
104104

105105
public override bool Equals(object obj)

src/KubernetesClient.Models/ResourceQuantityJsonConverter.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,23 @@ namespace k8s.Models
22
{
33
internal sealed class ResourceQuantityJsonConverter : JsonConverter<ResourceQuantity>
44
{
5+
// https://github.com/kubernetes/apimachinery/blob/4b14f804a0babdcc58e695d72f77ad29f536511e/pkg/api/resource/quantity.go#L683
56
public override ResourceQuantity Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
67
{
7-
return new ResourceQuantity(reader.GetString());
8+
switch (reader.TokenType)
9+
{
10+
case JsonTokenType.Null:
11+
return new ResourceQuantity(null);
12+
case JsonTokenType.Number:
13+
if (reader.TryGetDouble(out var val))
14+
{
15+
return new ResourceQuantity(Convert.ToString(val));
16+
}
17+
18+
return reader.GetDecimal();
19+
default:
20+
return new ResourceQuantity(reader.GetString());
21+
}
822
}
923

1024
public override void Write(Utf8JsonWriter writer, ResourceQuantity value, JsonSerializerOptions options)

tests/KubernetesClient.Tests/QuantityValueTests.cs

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using k8s.Models;
22
using System;
3+
using System.Collections.Generic;
34
using Xunit;
45
using static k8s.Models.ResourceQuantity.SuffixFormat;
56

@@ -200,7 +201,7 @@ public void QuantityString()
200201
}
201202

202203
[Fact]
203-
public void Serialize()
204+
public void SerializeJson()
204205
{
205206
{
206207
ResourceQuantity quantity = 12000;
@@ -209,10 +210,25 @@ public void Serialize()
209210
}
210211

211212
[Fact]
212-
public void DeserializeYaml()
213+
public void DeserializeJson()
213214
{
214-
var value = KubernetesYaml.Deserialize<ResourceQuantity>("\"1\"");
215-
Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value);
215+
// str
216+
{
217+
var value = KubernetesJson.Deserialize<Dictionary<string, ResourceQuantity>>(@"{""cpu"": ""1.1""}");
218+
Assert.Equal(new ResourceQuantity(11, -1, DecimalSI), value["cpu"]);
219+
}
220+
221+
// int
222+
{
223+
var value = KubernetesJson.Deserialize<Dictionary<string, ResourceQuantity>>(@"{""cpu"": 1}");
224+
Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value["cpu"]);
225+
}
226+
227+
// double
228+
{
229+
var value = KubernetesJson.Deserialize<Dictionary<string, ResourceQuantity>>(@"{""cpu"": 1.1}");
230+
Assert.Equal(new ResourceQuantity(11, -1, DecimalSI), value["cpu"]);
231+
}
216232
}
217233

218234
[Fact]
@@ -221,5 +237,27 @@ public void SerializeYaml()
221237
var value = KubernetesYaml.Serialize(new ResourceQuantity(1, -1, DecimalSI));
222238
Assert.Equal("100m", value);
223239
}
240+
241+
[Fact]
242+
public void DeserializeYaml()
243+
{
244+
// str
245+
{
246+
var value = KubernetesYaml.Deserialize<ResourceQuantity>("\"1\"");
247+
Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value);
248+
}
249+
250+
// int
251+
{
252+
var value = KubernetesYaml.Deserialize<ResourceQuantity>("1");
253+
Assert.Equal(new ResourceQuantity(1, 0, DecimalSI), value);
254+
}
255+
256+
// double
257+
{
258+
var value = KubernetesYaml.Deserialize<ResourceQuantity>("1.1");
259+
Assert.Equal(new ResourceQuantity(11, -1, DecimalSI), value);
260+
}
261+
}
224262
}
225263
}

0 commit comments

Comments
 (0)