@@ -15,52 +15,68 @@ namespace GraphQL.Client.Serializer.SystemTextJson
1515 /// </remarks>
1616 public class MapConverter : JsonConverter < Map >
1717 {
18- public override Map Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
19- {
20- using var doc = JsonDocument . ParseValue ( ref reader ) ;
21-
22- if ( doc ? . RootElement == null || doc ? . RootElement . ValueKind != JsonValueKind . Object )
23- {
24- throw new ArgumentException ( "This converter can only parse when the root element is a JSON Object." ) ;
25- }
26-
27- return ReadDictionary ( doc . RootElement , new Map ( ) ) ;
28- }
18+ public override Map Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options ) => ReadDictionary ( ref reader , new Map ( ) ) ;
2919
3020 public override void Write ( Utf8JsonWriter writer , Map value , JsonSerializerOptions options )
3121 => throw new NotImplementedException (
3222 "This converter currently is only intended to be used to read a JSON object into a strongly-typed representation." ) ;
3323
34- private TDictionary ReadDictionary < TDictionary > ( JsonElement element , TDictionary result )
24+ private static TDictionary ReadDictionary < TDictionary > ( ref Utf8JsonReader reader , TDictionary result )
3525 where TDictionary : Dictionary < string , object >
3626 {
37- foreach ( var property in element . EnumerateObject ( ) )
27+ if ( reader . TokenType != JsonTokenType . StartObject )
28+ throw new JsonException ( ) ;
29+
30+ while ( reader . Read ( ) )
3831 {
39- result [ property . Name ] = ReadValue ( property . Value ) ;
32+ if ( reader . TokenType == JsonTokenType . EndObject )
33+ break ;
34+
35+ if ( reader . TokenType != JsonTokenType . PropertyName )
36+ throw new JsonException ( ) ;
37+
38+ string key = reader . GetString ( ) ;
39+
40+ // move to property value
41+ if ( ! reader . Read ( ) )
42+ throw new JsonException ( ) ;
43+
44+ result . Add ( key , ReadValue ( ref reader ) ) ;
4045 }
46+
4147 return result ;
4248 }
4349
44- private IEnumerable < object ? > ReadArray ( JsonElement value )
50+ private static List < object > ReadArray ( ref Utf8JsonReader reader )
4551 {
46- foreach ( var item in value . EnumerateArray ( ) )
52+ if ( reader . TokenType != JsonTokenType . StartArray )
53+ throw new JsonException ( ) ;
54+
55+ var result = new List < object > ( ) ;
56+
57+ while ( reader . Read ( ) )
4758 {
48- yield return ReadValue ( item ) ;
59+ if ( reader . TokenType == JsonTokenType . EndArray )
60+ break ;
61+
62+ result . Add ( ReadValue ( ref reader ) ) ;
4963 }
50- }
5164
52- private object ? ReadValue ( JsonElement value )
53- => value . ValueKind switch
65+ return result ;
66+ }
67+
68+ private static object ? ReadValue ( ref Utf8JsonReader reader )
69+ => reader . TokenType switch
5470 {
55- JsonValueKind . Array => ReadArray ( value ) . ToList ( ) ,
56- JsonValueKind . Object => ReadDictionary ( value , new Dictionary < string , object > ( ) ) ,
57- JsonValueKind . Number => value . ReadNumber ( ) ,
58- JsonValueKind . True => true ,
59- JsonValueKind . False => false ,
60- JsonValueKind . String => value . GetString ( ) ,
61- JsonValueKind . Null => null ,
62- JsonValueKind . Undefined => null ,
63- _ => throw new InvalidOperationException ( $ "Unexpected value kind: { value . ValueKind } ")
71+ JsonTokenType . StartArray => ReadArray ( ref reader ) . ToList ( ) ,
72+ JsonTokenType . StartObject => ReadDictionary ( ref reader , new Dictionary < string , object > ( ) ) ,
73+ JsonTokenType . Number => reader . ReadNumber ( ) ,
74+ JsonTokenType . True => true ,
75+ JsonTokenType . False => false ,
76+ JsonTokenType . String => reader . GetString ( ) ,
77+ JsonTokenType . Null => null ,
78+ JsonTokenType . None => null ,
79+ _ => throw new InvalidOperationException ( $ "Unexpected value kind: { reader . TokenType } ")
6480 } ;
6581
6682
0 commit comments