@@ -530,7 +530,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
530530
531531 try
532532 {
533- var requestBody = JsonSerializer . Deserialize < dynamic > ( request . BodyString , ProxyUtils . JsonSerializerOptions ) ;
533+ var requestBody = JsonSerializer . Deserialize < JsonElement > ( request . BodyString , ProxyUtils . JsonSerializerOptions ) ;
534534
535535 response . Body = ReplacePlaceholdersInObject ( response . Body , requestBody , logger ) ;
536536 }
@@ -543,7 +543,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
543543 logger . LogTrace ( "Left {Method}" , nameof ( ReplacePlaceholders ) ) ;
544544 }
545545
546- private static object ? ReplacePlaceholdersInObject ( object ? obj , dynamic requestBody , ILogger logger )
546+ private static object ? ReplacePlaceholdersInObject ( object ? obj , JsonElement requestBody , ILogger logger )
547547 {
548548 logger . LogTrace ( "{Method} called" , nameof ( ReplacePlaceholdersInObject ) ) ;
549549
@@ -570,7 +570,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
570570 return ReplacePlaceholdersInJsonElement ( jsonElement , requestBody , logger ) ;
571571 }
572572
573- private static object ? ReplacePlaceholdersInJsonElement ( JsonElement element , dynamic requestBody , ILogger logger )
573+ private static object ? ReplacePlaceholdersInJsonElement ( JsonElement element , JsonElement requestBody , ILogger logger )
574574 {
575575 logger . LogTrace ( "{Method} called" , nameof ( ReplacePlaceholdersInJsonElement ) ) ;
576576
@@ -594,7 +594,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
594594 case JsonValueKind . String :
595595 return ReplacePlaceholderInString ( element . GetString ( ) ?? "" , requestBody , logger ) ;
596596 case JsonValueKind . Number :
597- return element . GetDecimal ( ) ;
597+ return GetSafeNumber ( element , logger ) ;
598598 case JsonValueKind . True :
599599 return true ;
600600 case JsonValueKind . False :
@@ -608,7 +608,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
608608 }
609609
610610#pragma warning disable CA1859 // Return type must be object because we can return any type from the request
611- private static object ? ReplacePlaceholderInString ( string value , dynamic requestBody , ILogger logger )
611+ private static object ? ReplacePlaceholderInString ( string value , JsonElement requestBody , ILogger logger )
612612#pragma warning restore CA1859
613613 {
614614 logger . LogTrace ( "{Method} called" , nameof ( ReplacePlaceholderInString ) ) ;
@@ -630,7 +630,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
630630 return GetValueFromRequestBody ( requestBody , propertyPath , logger ) ;
631631 }
632632
633- private static object ? GetValueFromRequestBody ( dynamic requestBody , string propertyPath , ILogger logger )
633+ private static object ? GetValueFromRequestBody ( JsonElement requestBody , string propertyPath , ILogger logger )
634634 {
635635 logger . LogTrace ( "{Method} called" , nameof ( GetValueFromRequestBody ) ) ;
636636
@@ -657,6 +657,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
657657 catch
658658 {
659659 // If we can't get the property, return null
660+ logger . LogDebug ( "Failed to get value for {PropertyPath}. Returning null" , propertyPath ) ;
660661 }
661662
662663 return null ;
@@ -694,7 +695,7 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
694695 return element . ValueKind switch
695696 {
696697 JsonValueKind . String => element . GetString ( ) ,
697- JsonValueKind . Number => element . GetDecimal ( ) ,
698+ JsonValueKind . Number => GetSafeNumber ( element , logger ) ,
698699 JsonValueKind . True => true ,
699700 JsonValueKind . False => false ,
700701 JsonValueKind . Null or JsonValueKind . Undefined => null ,
@@ -704,4 +705,31 @@ private static void ReplacePlaceholders(MockResponseResponse? response, Request
704705 _ => element . ToString ( ) ,
705706 } ;
706707 }
708+
709+ // Attempts to safely extract a number from a JsonElement, falling back to double or string if necessary
710+ private static object ? GetSafeNumber ( JsonElement element , ILogger logger )
711+ {
712+ logger . LogTrace ( "{Method} called" , nameof ( GetSafeNumber ) ) ;
713+
714+ // Try to get as int
715+ if ( element . TryGetInt32 ( out var intValue ) )
716+ {
717+ return intValue ;
718+ }
719+ if ( element . TryGetInt64 ( out var longValue ) )
720+ {
721+ return longValue ;
722+ }
723+ if ( element . TryGetDecimal ( out var decimalValue ) )
724+ {
725+ return decimalValue ;
726+ }
727+ if ( element . TryGetDouble ( out var doubleValue ) )
728+ {
729+ return doubleValue ;
730+ }
731+
732+ // Fallback: return as string to avoid exceptions
733+ return element . GetRawText ( ) ;
734+ }
707735}
0 commit comments