Skip to content

Commit 80f3d30

Browse files
committed
Add safe bool parsing to settings deserialization
1 parent 4043e74 commit 80f3d30

1 file changed

Lines changed: 34 additions & 0 deletions

File tree

CrossPlatformUI/App.axaml.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
208242
public sealed class SafeStringEnumConverterFactory : JsonConverterFactory
209243
{
210244
public override bool CanConvert(Type typeToConvert)

0 commit comments

Comments
 (0)