Skip to content

Commit 20165d9

Browse files
committed
JsonSerializer: fix deserialization of nested arrays in FillMode
Add ReadArrayAsync method to recursively parse nested arrays. FillAsync now delegates to this method instead of inline logic.
1 parent 912d44a commit 20165d9

File tree

1 file changed

+34
-24
lines changed

1 file changed

+34
-24
lines changed

Serialization/JsonSerializer.cs

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -419,30 +419,7 @@ private async ValueTask FillAsync(SettingsStorage storage, JsonReader reader, Ca
419419
}
420420
case JsonToken.StartArray:
421421
{
422-
await reader.ReadWithCheckAsync(cancellationToken);
423-
424-
var list = new List<object>();
425-
426-
while (reader.TokenType != JsonToken.EndArray)
427-
{
428-
switch (reader.TokenType)
429-
{
430-
case JsonToken.StartObject:
431-
{
432-
var inner = new SettingsStorage();
433-
await FillAsync(inner, reader, cancellationToken);
434-
list.Add(inner);
435-
break;
436-
}
437-
default:
438-
list.Add(reader.Value);
439-
break;
440-
}
441-
442-
await reader.ReadWithCheckAsync(cancellationToken);
443-
}
444-
445-
value = list.ToArray();
422+
value = await ReadArrayAsync(reader, cancellationToken);
446423
break;
447424
}
448425
default:
@@ -454,6 +431,39 @@ private async ValueTask FillAsync(SettingsStorage storage, JsonReader reader, Ca
454431
}
455432
}
456433

434+
private async ValueTask<object[]> ReadArrayAsync(JsonReader reader, CancellationToken cancellationToken)
435+
{
436+
await reader.ReadWithCheckAsync(cancellationToken);
437+
438+
var list = new List<object>();
439+
440+
while (reader.TokenType != JsonToken.EndArray)
441+
{
442+
switch (reader.TokenType)
443+
{
444+
case JsonToken.StartObject:
445+
{
446+
var inner = new SettingsStorage();
447+
await FillAsync(inner, reader, cancellationToken);
448+
list.Add(inner);
449+
break;
450+
}
451+
case JsonToken.StartArray:
452+
{
453+
list.Add(await ReadArrayAsync(reader, cancellationToken));
454+
break;
455+
}
456+
default:
457+
list.Add(reader.Value);
458+
break;
459+
}
460+
461+
await reader.ReadWithCheckAsync(cancellationToken);
462+
}
463+
464+
return list.ToArray();
465+
}
466+
457467
private async ValueTask TryClearDeepLevel(JsonReader reader, SettingsStorage storage, CancellationToken cancellationToken)
458468
{
459469
var lvl = storage.DeepLevel;

0 commit comments

Comments
 (0)