@@ -30,75 +30,107 @@ internal class ResponseValueJsonConverter : JsonConverter<object>
3030 {
3131 public override object Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
3232 {
33- return this . ProcessToken ( ref reader , options ) ;
33+ return ProcessReadToken ( ref reader , options ) ;
3434 }
3535
3636 public override void Write ( Utf8JsonWriter writer , object value , JsonSerializerOptions options )
3737 {
38- JsonSerializer . Serialize ( writer , value , options ) ;
38+ switch ( value )
39+ {
40+ case null :
41+ writer . WriteNullValue ( ) ;
42+ break ;
43+ case Enum :
44+ writer . WriteNumberValue ( Convert . ToInt64 ( value ) ) ;
45+ break ;
46+ case IEnumerable < object > list :
47+ writer . WriteStartArray ( ) ;
48+ foreach ( var item in list )
49+ {
50+ Write ( writer , item , options ) ;
51+ }
52+ writer . WriteEndArray ( ) ;
53+ break ;
54+ case IDictionary < string , object > dictionary :
55+ writer . WriteStartObject ( ) ;
56+ foreach ( var pair in dictionary )
57+ {
58+ writer . WritePropertyName ( pair . Key ) ;
59+ Write ( writer , pair . Value , options ) ;
60+ }
61+ writer . WriteEndObject ( ) ;
62+ break ;
63+ case object obj :
64+ JsonSerializer . Serialize ( writer , obj , options . GetTypeInfo ( obj . GetType ( ) ) ) ;
65+ break ;
66+ }
3967 }
4068
41- private object ProcessToken ( ref Utf8JsonReader reader , JsonSerializerOptions options )
69+ private static object ProcessReadToken ( ref Utf8JsonReader reader , JsonSerializerOptions options )
4270 {
4371 // Recursively processes a token. This is required for elements that next other elements.
44- object processedObject = null ;
72+ object processedObject ;
4573
46- if ( reader . TokenType == JsonTokenType . StartObject )
74+ switch ( reader . TokenType )
4775 {
48- Dictionary < string , object > dictionaryValue = new Dictionary < string , object > ( ) ;
49- while ( reader . Read ( ) && reader . TokenType != JsonTokenType . EndObject )
50- {
51- string elementKey = reader . GetString ( ) ;
52- reader . Read ( ) ;
53- dictionaryValue . Add ( elementKey , this . ProcessToken ( ref reader , options ) ) ;
54- }
76+ case JsonTokenType . StartObject :
77+ {
78+ Dictionary < string , object > dictionaryValue = [ ] ;
79+ while ( reader . Read ( ) && reader . TokenType != JsonTokenType . EndObject )
80+ {
81+ string elementKey = reader . GetString ( ) ;
82+ reader . Read ( ) ;
83+ dictionaryValue . Add ( elementKey , ProcessReadToken ( ref reader , options ) ) ;
84+ }
5585
56- processedObject = dictionaryValue ;
57- }
58- else if ( reader . TokenType == JsonTokenType . StartArray )
59- {
60- List < object > arrayValue = new List < object > ( ) ;
61- while ( reader . Read ( ) && reader . TokenType != JsonTokenType . EndArray )
62- {
63- arrayValue . Add ( this . ProcessToken ( ref reader , options ) ) ;
64- }
86+ processedObject = dictionaryValue ;
87+ break ;
88+ }
6589
66- processedObject = arrayValue . ToArray ( ) ;
67- }
68- else if ( reader . TokenType == JsonTokenType . Null )
69- {
70- processedObject = null ;
71- }
72- else if ( reader . TokenType == JsonTokenType . False )
73- {
74- processedObject = false ;
75- }
76- else if ( reader . TokenType == JsonTokenType . True )
77- {
78- processedObject = true ;
79- }
80- else if ( reader . TokenType == JsonTokenType . String )
81- {
82- processedObject = reader . GetString ( ) ;
83- }
84- else if ( reader . TokenType == JsonTokenType . Number )
85- {
86- if ( reader . TryGetInt64 ( out long longValue ) )
87- {
88- processedObject = longValue ;
89- }
90- else if ( reader . TryGetDouble ( out double doubleValue ) )
91- {
92- processedObject = doubleValue ;
93- }
94- else
95- {
96- throw new JsonException ( $ "Unrecognized '{ JsonElement . ParseValue ( ref reader ) } ' token as a number value.") ;
97- }
98- }
99- else
100- {
101- throw new JsonException ( $ "Unrecognized '{ reader . TokenType } ' token type while parsing command response.") ;
90+ case JsonTokenType . StartArray :
91+ {
92+ List < object > arrayValue = [ ] ;
93+ while ( reader . Read ( ) && reader . TokenType != JsonTokenType . EndArray )
94+ {
95+ arrayValue . Add ( ProcessReadToken ( ref reader , options ) ) ;
96+ }
97+
98+ processedObject = arrayValue . ToArray ( ) ;
99+ break ;
100+ }
101+
102+ case JsonTokenType . Null :
103+ processedObject = null ;
104+ break ;
105+ case JsonTokenType . False :
106+ processedObject = false ;
107+ break ;
108+ case JsonTokenType . True :
109+ processedObject = true ;
110+ break ;
111+ case JsonTokenType . String :
112+ processedObject = reader . GetString ( ) ;
113+ break ;
114+ case JsonTokenType . Number :
115+ {
116+ if ( reader . TryGetInt64 ( out long longValue ) )
117+ {
118+ processedObject = longValue ;
119+ }
120+ else if ( reader . TryGetDouble ( out double doubleValue ) )
121+ {
122+ processedObject = doubleValue ;
123+ }
124+ else
125+ {
126+ throw new JsonException ( $ "Unrecognized '{ JsonElement . ParseValue ( ref reader ) } ' token as a number value.") ;
127+ }
128+
129+ break ;
130+ }
131+
132+ default :
133+ throw new JsonException ( $ "Unrecognized '{ reader . TokenType } ' token type while parsing command response.") ;
102134 }
103135
104136 return processedObject ;
0 commit comments