@@ -189,6 +189,7 @@ public SerializationContext(bool _) // added an argument to avoid constructors c
189189 private static JsonSerializerOptions InitSafeOptions ( )
190190 {
191191 var options = Default . GeneratedSerializerOptions ! ;
192+ options . Converters . Add ( new SafeBoolConverter ( ) ) ;
192193 options . Converters . Add ( new SafeStringEnumConverterFactory ( ) ) ;
193194 return options ;
194195 }
@@ -200,11 +201,44 @@ public static JsonSerializerOptions CreateSafeOptions()
200201 {
201202 TypeInfoResolver = SerializationContext . Default
202203 } ;
204+ options . Converters . Add ( new SafeBoolConverter ( ) ) ;
203205 options . Converters . Add ( new SafeStringEnumConverterFactory ( ) ) ;
204206 return options ;
205207 }
206208}
207209
210+ public sealed class SafeBoolConverter : JsonConverter < bool >
211+ {
212+ public override bool Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
213+ {
214+ try
215+ {
216+ if ( reader . TokenType == JsonTokenType . True ) { return true ; }
217+ if ( reader . TokenType == JsonTokenType . False ) { return false ; }
218+ if ( reader . TokenType == JsonTokenType . Null ) { return false ; }
219+ if ( reader . TokenType == JsonTokenType . String )
220+ {
221+ var s = reader . GetString ( ) ;
222+ if ( bool . TryParse ( s , out var result ) ) { return result ; }
223+ }
224+ if ( reader . TokenType == JsonTokenType . Number )
225+ {
226+ if ( reader . TryGetInt32 ( out var n ) ) { return n > 0 ; }
227+ }
228+ }
229+ catch
230+ {
231+ }
232+
233+ return false ;
234+ }
235+
236+ public override void Write ( Utf8JsonWriter writer , bool value , JsonSerializerOptions options )
237+ {
238+ writer . WriteBooleanValue ( value ) ;
239+ }
240+ }
241+
208242public sealed class SafeStringEnumConverterFactory : JsonConverterFactory
209243{
210244 public override bool CanConvert ( Type typeToConvert )
0 commit comments