diff --git a/src/Extensions/ToolJsonOptions.cs b/src/Extensions/ToolJsonOptions.cs
index a4625e3..3d286e6 100644
--- a/src/Extensions/ToolJsonOptions.cs
+++ b/src/Extensions/ToolJsonOptions.cs
@@ -1,7 +1,6 @@
using System.Diagnostics;
using System.Text.Json;
-using System.Text.Json.Serialization;
-using System.Text.Json.Serialization.Metadata;
+using Microsoft.Extensions.AI;
namespace Devlooped.Extensions.AI;
@@ -16,19 +15,14 @@ public static class ToolJsonOptions
///
/// Default for function calling and tools.
///
- public static JsonSerializerOptions Default { get; } = new(JsonSerializerDefaults.Web)
+ public static JsonSerializerOptions Default { get; } = new(AIJsonUtilities.DefaultOptions)
{
Converters =
{
new AdditionalPropertiesDictionaryConverter(),
- new JsonStringEnumConverter(),
},
- DefaultIgnoreCondition =
- JsonIgnoreCondition.WhenWritingDefault |
- JsonIgnoreCondition.WhenWritingNull,
- Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
- WriteIndented = Debugger.IsAttached,
- TypeInfoResolver = new TypeInjectingResolver(new DefaultJsonTypeInfoResolver())
+ WriteIndented = Debugger.IsAttached || AIJsonUtilities.DefaultOptions.WriteIndented,
+ TypeInfoResolver = new TypeInjectingResolver(AIJsonUtilities.DefaultOptions.TypeInfoResolverChain)
};
}
diff --git a/src/Extensions/TypeInjectingResolver.cs b/src/Extensions/TypeInjectingResolver.cs
index 570d129..0a0eee3 100644
--- a/src/Extensions/TypeInjectingResolver.cs
+++ b/src/Extensions/TypeInjectingResolver.cs
@@ -18,8 +18,7 @@ public static JsonSerializerOptions WithTypeInjection(this JsonSerializerOptions
if (options.IsReadOnly)
options = new(options);
- options.TypeInfoResolver = new TypeInjectingResolver(
- JsonTypeInfoResolver.Combine([.. options.TypeInfoResolverChain]));
+ options.TypeInfoResolver = new TypeInjectingResolver(options.TypeInfoResolverChain);
return options;
}
@@ -29,12 +28,15 @@ public static JsonSerializerOptions WithTypeInjection(this JsonSerializerOptions
/// A custom that injects a $type property into object types
/// so they can be automatically distinguished during deserialization or inspection.
///
-public class TypeInjectingResolver(IJsonTypeInfoResolver inner) : IJsonTypeInfoResolver
+public class TypeInjectingResolver(IList chain) : IJsonTypeInfoResolver
{
+ readonly IJsonTypeInfoResolver resolver = JsonTypeInfoResolver.Combine([.. chain]);
+
///
public JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options)
{
- var info = inner.GetTypeInfo(type, options);
+ var info = resolver.GetTypeInfo(type, options);
+
// The $type would already be present for polymorphic serialization.
if (info?.Kind == JsonTypeInfoKind.Object && !info.Properties.Any(x => x.Name == "$type"))
{
@@ -43,6 +45,7 @@ public class TypeInjectingResolver(IJsonTypeInfoResolver inner) : IJsonTypeInfoR
prop.Order = -1000; // Ensure it is serialized first
info.Properties.Add(prop);
}
+
return info;
}
}