Skip to content

Commit da467a2

Browse files
committed
Add STJ converters
1 parent de3b92c commit da467a2

25 files changed

Lines changed: 847 additions & 0 deletions
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Text.Json;
7+
using System.Text.Json.Serialization;
8+
9+
namespace NuGet.Protocol.Converters
10+
{
11+
/// <summary>
12+
/// Reads a JSON string or array of strings into a single comma-separated string.
13+
/// Equivalent to <see cref="MetadataFieldConverter"/> for System.Text.Json.
14+
/// </summary>
15+
/// <remarks>NSJ equivalent: <see cref="MetadataFieldConverter"/>.</remarks>
16+
internal sealed class MetadataFieldStjConverter : JsonConverter<string>
17+
{
18+
public override bool HandleNull => true;
19+
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
20+
{
21+
if (reader.TokenType == JsonTokenType.Null)
22+
{
23+
return string.Empty;
24+
}
25+
26+
if (reader.TokenType == JsonTokenType.StartArray)
27+
{
28+
var values = new List<string>();
29+
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
30+
{
31+
var s = reader.GetString();
32+
if (!string.IsNullOrWhiteSpace(s))
33+
{
34+
values.Add(s!);
35+
}
36+
}
37+
return string.Join(", ", values);
38+
}
39+
40+
return reader.GetString() ?? string.Empty;
41+
}
42+
43+
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
44+
=> throw new NotSupportedException();
45+
}
46+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Text.Json;
7+
using System.Text.Json.Serialization;
8+
9+
namespace NuGet.Protocol.Converters
10+
{
11+
/// <summary>
12+
/// Reads a JSON string or array of strings into an <see cref="IReadOnlyList{T}"/> of strings.
13+
/// Equivalent to <see cref="MetadataStringOrArrayConverter"/> for System.Text.Json.
14+
/// </summary>
15+
/// <remarks>NSJ equivalent: <see cref="MetadataStringOrArrayConverter"/>.</remarks>
16+
internal sealed class MetadataStringOrArrayStjConverter : JsonConverter<IReadOnlyList<string>>
17+
{
18+
public override IReadOnlyList<string>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
19+
{
20+
if (reader.TokenType == JsonTokenType.String)
21+
{
22+
var str = reader.GetString();
23+
return string.IsNullOrWhiteSpace(str) ? null : new[] { str! };
24+
}
25+
26+
if (reader.TokenType != JsonTokenType.StartArray)
27+
{
28+
throw new JsonException(string.Format(System.Globalization.CultureInfo.CurrentCulture, Strings.Error_UnexpectedJsonToken, reader.TokenType));
29+
}
30+
31+
var values = new List<string>();
32+
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
33+
{
34+
values.Add(reader.GetString() ?? string.Empty);
35+
}
36+
return values.ToArray();
37+
}
38+
39+
public override void Write(Utf8JsonWriter writer, IReadOnlyList<string> value, JsonSerializerOptions options)
40+
=> throw new NotSupportedException();
41+
}
42+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Text.Json;
6+
using System.Text.Json.Serialization;
7+
using NuGet.Frameworks;
8+
9+
namespace NuGet.Protocol.Converters
10+
{
11+
/// <remarks>NSJ equivalent: <see cref="NuGetFrameworkConverter"/> (registered globally in <see cref="JsonExtensions.ObjectSerializationSettings"/>).</remarks>
12+
internal sealed class NuGetFrameworkStjConverter : JsonConverter<NuGetFramework>
13+
{
14+
public override bool HandleNull => true;
15+
public override NuGetFramework Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
16+
{
17+
if (reader.TokenType == JsonTokenType.Null)
18+
{
19+
return NuGetFramework.AnyFramework;
20+
}
21+
22+
var value = reader.GetString();
23+
return string.IsNullOrEmpty(value) ? NuGetFramework.AnyFramework : NuGetFramework.Parse(value!);
24+
}
25+
26+
public override void Write(Utf8JsonWriter writer, NuGetFramework value, JsonSerializerOptions options)
27+
=> writer.WriteStringValue(value.GetShortFolderName());
28+
}
29+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Text.Json;
6+
using System.Text.Json.Serialization;
7+
using NuGet.Versioning;
8+
9+
namespace NuGet.Protocol.Converters
10+
{
11+
/// <remarks>NSJ equivalent: <see cref="NuGetVersionConverter"/> (registered globally in <see cref="JsonExtensions.ObjectSerializationSettings"/>).</remarks>
12+
internal sealed class NuGetVersionStjConverter : JsonConverter<NuGetVersion>
13+
{
14+
public override NuGetVersion? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
15+
{
16+
var str = reader.GetString();
17+
return str is null ? null : NuGetVersion.Parse(str);
18+
}
19+
20+
public override void Write(Utf8JsonWriter writer, NuGetVersion value, JsonSerializerOptions options)
21+
{
22+
if (value is null)
23+
{
24+
writer.WriteNullValue();
25+
}
26+
else
27+
{
28+
writer.WriteStringValue(value.ToString());
29+
}
30+
}
31+
}
32+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Text.Json;
7+
using System.Text.Json.Serialization;
8+
using NuGet.Frameworks;
9+
using NuGet.Packaging;
10+
using NuGet.Packaging.Core;
11+
12+
namespace NuGet.Protocol.Converters
13+
{
14+
/// <remarks>No NSJ equivalent.</remarks>
15+
internal sealed class PackageDependencyGroupStjConverter : JsonConverter<PackageDependencyGroup>
16+
{
17+
private static readonly PackageDependencyStjConverter _dependencyConverter = new();
18+
19+
public override PackageDependencyGroup Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
20+
{
21+
if (reader.TokenType != JsonTokenType.StartObject)
22+
{
23+
throw new JsonException();
24+
}
25+
26+
NuGetFramework? targetFramework = null;
27+
var packages = new List<PackageDependency>();
28+
29+
while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
30+
{
31+
if (reader.TokenType != JsonTokenType.PropertyName)
32+
{
33+
continue;
34+
}
35+
36+
var propName = reader.GetString();
37+
reader.Read();
38+
39+
if (string.Equals(propName, JsonProperties.TargetFramework, StringComparison.OrdinalIgnoreCase))
40+
{
41+
if (reader.TokenType != JsonTokenType.Null)
42+
{
43+
var fw = reader.GetString();
44+
targetFramework = string.IsNullOrEmpty(fw) ? null : NuGetFramework.Parse(fw!);
45+
}
46+
}
47+
else if (string.Equals(propName, JsonProperties.Dependencies, StringComparison.OrdinalIgnoreCase))
48+
{
49+
if (reader.TokenType == JsonTokenType.StartArray)
50+
{
51+
while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
52+
{
53+
packages.Add(_dependencyConverter.Read(ref reader, typeof(PackageDependency), options));
54+
}
55+
}
56+
else
57+
{
58+
reader.Skip();
59+
}
60+
}
61+
else
62+
{
63+
reader.Skip();
64+
}
65+
}
66+
67+
return new PackageDependencyGroup(targetFramework ?? NuGetFramework.AnyFramework, packages);
68+
}
69+
70+
public override void Write(Utf8JsonWriter writer, PackageDependencyGroup value, JsonSerializerOptions options)
71+
{
72+
writer.WriteStartObject();
73+
writer.WriteString(JsonProperties.TargetFramework, value.TargetFramework.GetShortFolderName());
74+
writer.WriteStartArray(JsonProperties.Dependencies);
75+
foreach (var pkg in value.Packages)
76+
{
77+
_dependencyConverter.Write(writer, pkg, options);
78+
}
79+
writer.WriteEndArray();
80+
writer.WriteEndObject();
81+
}
82+
}
83+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Globalization;
6+
using System.Text.Json;
7+
using System.Text.Json.Serialization;
8+
using NuGet.Packaging.Core;
9+
using NuGet.Versioning;
10+
11+
namespace NuGet.Protocol.Converters
12+
{
13+
/// <remarks>No NSJ equivalent.</remarks>
14+
internal sealed class PackageDependencyStjConverter : JsonConverter<PackageDependency>
15+
{
16+
private static readonly VersionRangeStjConverter _versionRangeConverter = new();
17+
18+
public override PackageDependency Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
19+
{
20+
if (reader.TokenType != JsonTokenType.StartObject)
21+
{
22+
throw new JsonException();
23+
}
24+
25+
string? id = null;
26+
VersionRange? range = null;
27+
28+
while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
29+
{
30+
if (reader.TokenType != JsonTokenType.PropertyName)
31+
{
32+
continue;
33+
}
34+
35+
var propName = reader.GetString();
36+
reader.Read();
37+
38+
if (string.Equals(propName, JsonProperties.PackageId, StringComparison.OrdinalIgnoreCase))
39+
{
40+
id = reader.GetString();
41+
}
42+
else if (string.Equals(propName, JsonProperties.Range, StringComparison.OrdinalIgnoreCase))
43+
{
44+
if (reader.TokenType != JsonTokenType.Null)
45+
{
46+
range = _versionRangeConverter.Read(ref reader, typeof(VersionRange), options);
47+
}
48+
}
49+
else
50+
{
51+
reader.Skip();
52+
}
53+
}
54+
55+
if (string.IsNullOrEmpty(id))
56+
{
57+
throw new JsonException(string.Format(System.Globalization.CultureInfo.CurrentCulture, Strings.Error_RequiredJsonPropertyMissing, JsonProperties.PackageId));
58+
}
59+
60+
return new PackageDependency(id!, range);
61+
}
62+
63+
public override void Write(Utf8JsonWriter writer, PackageDependency value, JsonSerializerOptions options)
64+
{
65+
writer.WriteStartObject();
66+
writer.WriteString(JsonProperties.PackageId, value.Id);
67+
writer.WritePropertyName(JsonProperties.Range);
68+
_versionRangeConverter.Write(writer, value.VersionRange, options);
69+
writer.WriteEndObject();
70+
}
71+
}
72+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Text.Json;
6+
using System.Text.Json.Serialization;
7+
8+
namespace NuGet.Protocol.Converters
9+
{
10+
/// <remarks>NSJ equivalent: <see cref="SafeBoolConverter"/>.</remarks>
11+
internal sealed class SafeBoolStjConverter : JsonConverter<bool>
12+
{
13+
public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
14+
{
15+
switch (reader.TokenType)
16+
{
17+
case JsonTokenType.True:
18+
return true;
19+
case JsonTokenType.False:
20+
case JsonTokenType.Null:
21+
return false;
22+
case JsonTokenType.String:
23+
return bool.TryParse(reader.GetString()?.Trim(), out bool flag) && flag;
24+
case JsonTokenType.Number:
25+
return reader.TryGetInt64(out long l) && l == 1;
26+
default:
27+
reader.Skip();
28+
return false;
29+
}
30+
}
31+
32+
public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
33+
{
34+
throw new NotSupportedException();
35+
}
36+
}
37+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Text.Json;
6+
using System.Text.Json.Serialization;
7+
8+
namespace NuGet.Protocol.Converters
9+
{
10+
/// <remarks>NSJ equivalent: <see cref="SafeUriConverter"/>.</remarks>
11+
internal sealed class SafeUriStjConverter : JsonConverter<Uri>
12+
{
13+
public override Uri? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
14+
{
15+
if (reader.TokenType == JsonTokenType.String)
16+
{
17+
Uri.TryCreate(reader.GetString()?.Trim(), UriKind.Absolute, out Uri? uri);
18+
return uri;
19+
}
20+
21+
reader.Skip();
22+
return null;
23+
}
24+
25+
public override void Write(Utf8JsonWriter writer, Uri value, JsonSerializerOptions options)
26+
{
27+
throw new NotSupportedException();
28+
}
29+
}
30+
}

0 commit comments

Comments
 (0)