<PackageReference Include="System.ClientModel" Version="1.8.0" />

JsonCollectionReader

using System.ClientModel.Internal; using System.Collections; using System.Runtime.CompilerServices; using System.Text.Json; namespace System.ClientModel.Primitives { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] internal class JsonCollectionReader : CollectionReader { internal override object Read(ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper, BinaryData data, ModelReaderWriterTypeBuilder builder, ModelReaderWriterContext context, ModelReaderWriterOptions options) { Utf8JsonReader reader = new Utf8JsonReader(BinaryData.op_Implicit(data), default(JsonReaderOptions)); reader.Read(); if (collectionWrapper.Builder is IDictionary) { if (reader.TokenType != JsonTokenType.StartObject) throw new FormatException("Expected start of dictionary."); } else if (reader.TokenType != JsonTokenType.StartArray) { throw new FormatException("Expected start of array."); } ReadJsonCollection(ref reader, collectionWrapper, builder, options, context); return collectionWrapper.ToCollection(); } private static void ReadJsonCollection(ref Utf8JsonReader reader, ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper, ModelReaderWriterTypeBuilder builder, ModelReaderWriterOptions options, ModelReaderWriterContext context) { object builder2 = collectionWrapper.Builder; bool flag = false; IJsonModel<object> jsonModel = null; string key = null; ModelReaderWriterTypeBuilder typeBuilder = context.GetTypeBuilder(builder.GetItemType()); object obj = typeBuilder.CreateObject(); ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper2 = obj as ModelReaderWriterTypeBuilder.CollectionWrapper; if (collectionWrapper2 != null) flag = (collectionWrapper2.Builder is IDictionary); else { IJsonModel<object> jsonModel2 = obj as IJsonModel<object>; if (jsonModel2 == null) { Type itemType = builder.GetItemType(); throw new InvalidOperationException("Item type '" + (((object)itemType != null) ? itemType.ToFriendlyName() : null) + "' must implement IJsonModel"); } jsonModel = jsonModel2; } while (reader.Read()) { switch (reader.TokenType) { case JsonTokenType.EndObject: return; case JsonTokenType.EndArray: return; case JsonTokenType.StartObject: if (flag) { ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper4 = typeBuilder.CreateObject() as ModelReaderWriterTypeBuilder.CollectionWrapper; ReadJsonCollection(ref reader, collectionWrapper4, typeBuilder, options, context); collectionWrapper.AddItem(collectionWrapper4.ToCollection(), key); } else { if (jsonModel == null) throw new FormatException("Unexpected JsonTokenType.StartObject found."); collectionWrapper.AddItem(jsonModel.Create(ref reader, options), key); } break; case JsonTokenType.StartArray: { if (flag) throw new FormatException("Unexpected JsonTokenType.StartArray found."); ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper3 = typeBuilder.CreateObject() as ModelReaderWriterTypeBuilder.CollectionWrapper; if (collectionWrapper3 != null) { ReadJsonCollection(ref reader, collectionWrapper3, typeBuilder, options, context); collectionWrapper.AddItem(collectionWrapper3.ToCollection(), key); } else collectionWrapper.AddItem(jsonModel.Create(ref reader, options), key); break; } case JsonTokenType.PropertyName: key = reader.GetString(); break; case JsonTokenType.Null: collectionWrapper.AddItem(null, key); break; default: throw new FormatException($"""{reader.TokenType}"""); } } } } }