Use JsonElement.Parse for string-to-JsonElement deserialization (#1002)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
This commit is contained in:
Copilot 2025-11-21 11:00:11 +02:00 • committed by GitHub
commit a559bfb891
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 48 additions and 48 deletions

View file

@ -78,16 +78,16 @@ async ValueTask<ElicitResult> HandleElicitationAsync(ElicitRequestParams? reques
// Try standard boolean parsing first // Try standard boolean parsing first
if (bool.TryParse(clientInput, out parsedBool)) if (bool.TryParse(clientInput, out parsedBool))
{ {
content[property.Key] = JsonSerializer.Deserialize<JsonElement>(JsonSerializer.Serialize(parsedBool)); content[property.Key] = JsonElement.Parse(JsonSerializer.Serialize(parsedBool));
} }
// Also accept "yes"/"no" as valid boolean inputs // Also accept "yes"/"no" as valid boolean inputs
else if (string.Equals(clientInput?.Trim(), "yes", StringComparison.OrdinalIgnoreCase)) else if (string.Equals(clientInput?.Trim(), "yes", StringComparison.OrdinalIgnoreCase))
{ {
content[property.Key] = JsonSerializer.Deserialize<JsonElement>(JsonSerializer.Serialize(true)); content[property.Key] = JsonElement.Parse(JsonSerializer.Serialize(true));
} }
else if (string.Equals(clientInput?.Trim(), "no", StringComparison.OrdinalIgnoreCase)) else if (string.Equals(clientInput?.Trim(), "no", StringComparison.OrdinalIgnoreCase))
{ {
content[property.Key] = JsonSerializer.Deserialize<JsonElement>(JsonSerializer.Serialize(false)); content[property.Key] = JsonElement.Parse(JsonSerializer.Serialize(false));
} }
} }
else if (property.Value is ElicitRequestParams.NumberSchema numberSchema) else if (property.Value is ElicitRequestParams.NumberSchema numberSchema)
@ -97,14 +97,14 @@ async ValueTask<ElicitResult> HandleElicitationAsync(ElicitRequestParams? reques
double parsedNumber; double parsedNumber;
if (double.TryParse(clientInput, out parsedNumber)) if (double.TryParse(clientInput, out parsedNumber))
{ {
content[property.Key] = JsonSerializer.Deserialize<JsonElement>(JsonSerializer.Serialize(parsedNumber)); content[property.Key] = JsonElement.Parse(JsonSerializer.Serialize(parsedNumber));
} }
} }
else if (property.Value is ElicitRequestParams.StringSchema stringSchema) else if (property.Value is ElicitRequestParams.StringSchema stringSchema)
{ {
Console.Write($"{stringSchema.Description}: "); Console.Write($"{stringSchema.Description}: ");
var clientInput = Console.ReadLine(); var clientInput = Console.ReadLine();
content[property.Key] = JsonSerializer.Deserialize<JsonElement>(JsonSerializer.Serialize(clientInput)); content[property.Key] = JsonElement.Parse(JsonSerializer.Serialize(clientInput));
} }
} }

View file

@ -81,7 +81,7 @@ internal static class Program
Params = JsonSerializer.SerializeToNode(new LoggingMessageNotificationParams Params = JsonSerializer.SerializeToNode(new LoggingMessageNotificationParams
{ {
Level = logLevel, Level = logLevel,
Data = JsonSerializer.Deserialize<JsonElement>("\"Random log message\"") Data = JsonElement.Parse("\"Random log message\"")
}) })
}, cancellationToken); }, cancellationToken);
} }
@ -117,7 +117,7 @@ internal static class Program
{ {
Name = "echo", Name = "echo",
Description = "Echoes the input back to the client.", Description = "Echoes the input back to the client.",
InputSchema = JsonSerializer.Deserialize<JsonElement>(""" InputSchema = JsonElement.Parse("""
{ {
"type": "object", "type": "object",
"properties": { "properties": {
@ -134,17 +134,17 @@ internal static class Program
{ {
Name = "echoSessionId", Name = "echoSessionId",
Description = "Echoes the session id back to the client.", Description = "Echoes the session id back to the client.",
InputSchema = JsonSerializer.Deserialize<JsonElement>(""" InputSchema = JsonElement.Parse("""
{ {
"type": "object" "type": "object"
} }
""", McpJsonUtilities.DefaultOptions), """),
}, },
new Tool new Tool
{ {
Name = "sampleLLM", Name = "sampleLLM",
Description = "Samples from an LLM using MCP's sampling feature.", Description = "Samples from an LLM using MCP's sampling feature.",
InputSchema = JsonSerializer.Deserialize<JsonElement>(""" InputSchema = JsonElement.Parse("""
{ {
"type": "object", "type": "object",
"properties": { "properties": {

View file

@ -107,7 +107,7 @@ public class Program
{ {
Name = "echo", Name = "echo",
Description = "Echoes the input back to the client.", Description = "Echoes the input back to the client.",
InputSchema = JsonSerializer.Deserialize<JsonElement>(""" InputSchema = JsonElement.Parse("""
{ {
"type": "object", "type": "object",
"properties": { "properties": {
@ -118,23 +118,23 @@ public class Program
}, },
"required": ["message"] "required": ["message"]
} }
""", McpJsonUtilities.DefaultOptions), """),
}, },
new Tool new Tool
{ {
Name = "echoSessionId", Name = "echoSessionId",
Description = "Echoes the session id back to the client.", Description = "Echoes the session id back to the client.",
InputSchema = JsonSerializer.Deserialize<JsonElement>(""" InputSchema = JsonElement.Parse("""
{ {
"type": "object" "type": "object"
} }
""", McpJsonUtilities.DefaultOptions), """),
}, },
new Tool new Tool
{ {
Name = "sampleLLM", Name = "sampleLLM",
Description = "Samples from an LLM using MCP's sampling feature.", Description = "Samples from an LLM using MCP's sampling feature.",
InputSchema = JsonSerializer.Deserialize<JsonElement>(""" InputSchema = JsonElement.Parse("""
{ {
"type": "object", "type": "object",
"properties": { "properties": {
@ -149,7 +149,7 @@ public class Program
}, },
"required": ["prompt", "maxTokens"] "required": ["prompt", "maxTokens"]
} }
""", McpJsonUtilities.DefaultOptions), """),
} }
] ]
}; };

View file

@ -43,13 +43,13 @@ public partial class McpServerBuilderExtensionsToolsTests : ClientServerTestBase
{ {
Name = "FirstCustomTool", Name = "FirstCustomTool",
Description = "First tool returned by custom handler", Description = "First tool returned by custom handler",
InputSchema = JsonSerializer.Deserialize<JsonElement>(""" InputSchema = JsonElement.Parse("""
{ {
"type": "object", "type": "object",
"properties": {}, "properties": {},
"required": [] "required": []
} }
""", McpJsonUtilities.DefaultOptions), """),
}], }],
}; };
@ -61,13 +61,13 @@ public partial class McpServerBuilderExtensionsToolsTests : ClientServerTestBase
{ {
Name = "SecondCustomTool", Name = "SecondCustomTool",
Description = "Second tool returned by custom handler", Description = "Second tool returned by custom handler",
InputSchema = JsonSerializer.Deserialize<JsonElement>(""" InputSchema = JsonElement.Parse("""
{ {
"type": "object", "type": "object",
"properties": {}, "properties": {},
"required": [] "required": []
} }
""", McpJsonUtilities.DefaultOptions), """),
}], }],
}; };
@ -79,13 +79,13 @@ public partial class McpServerBuilderExtensionsToolsTests : ClientServerTestBase
{ {
Name = "FinalCustomTool", Name = "FinalCustomTool",
Description = "Third tool returned by custom handler", Description = "Third tool returned by custom handler",
InputSchema = JsonSerializer.Deserialize<JsonElement>(""" InputSchema = JsonElement.Parse("""
{ {
"type": "object", "type": "object",
"properties": {}, "properties": {},
"required": [] "required": []
} }
""", McpJsonUtilities.DefaultOptions), """),
}], }],
}; };

View file

@ -120,18 +120,18 @@ public partial class ElicitationTests : ClientServerTestBase
Action = "accept", Action = "accept",
Content = new Dictionary<string, JsonElement> Content = new Dictionary<string, JsonElement>
{ {
["prop1"] = (JsonElement)JsonSerializer.Deserialize(""" ["prop1"] = JsonElement.Parse("""
"string result" "string result"
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
["prop2"] = (JsonElement)JsonSerializer.Deserialize(""" ["prop2"] = JsonElement.Parse("""
42 42
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
["prop3"] = (JsonElement)JsonSerializer.Deserialize(""" ["prop3"] = JsonElement.Parse("""
true true
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
["prop4"] = (JsonElement)JsonSerializer.Deserialize(""" ["prop4"] = JsonElement.Parse("""
"option2" "option2"
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
}, },
}; };
} }

View file

@ -177,24 +177,24 @@ public partial class ElicitationTypedTests : ClientServerTestBase
Action = "accept", Action = "accept",
Content = new Dictionary<string, JsonElement> Content = new Dictionary<string, JsonElement>
{ {
[nameof(SampleForm.Name)] = (JsonElement)JsonSerializer.Deserialize(""" [nameof(SampleForm.Name)] = JsonElement.Parse("""
"Alice" "Alice"
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
[nameof(SampleForm.Age)] = (JsonElement)JsonSerializer.Deserialize(""" [nameof(SampleForm.Age)] = JsonElement.Parse("""
30 30
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
[nameof(SampleForm.Active)] = (JsonElement)JsonSerializer.Deserialize(""" [nameof(SampleForm.Active)] = JsonElement.Parse("""
true true
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
[nameof(SampleForm.Role)] = (JsonElement)JsonSerializer.Deserialize(""" [nameof(SampleForm.Role)] = JsonElement.Parse("""
"Admin" "Admin"
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
[nameof(SampleForm.Score)] = (JsonElement)JsonSerializer.Deserialize(""" [nameof(SampleForm.Score)] = JsonElement.Parse("""
99.5 99.5
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
[nameof(SampleForm.Created)] = (JsonElement)JsonSerializer.Deserialize(""" [nameof(SampleForm.Created)] = JsonElement.Parse("""
"2023-08-27T03:05:00" "2023-08-27T03:05:00"
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
}, },
}; };
}, },
@ -228,15 +228,15 @@ public partial class ElicitationTypedTests : ClientServerTestBase
Action = "accept", Action = "accept",
Content = new Dictionary<string, JsonElement> Content = new Dictionary<string, JsonElement>
{ {
["firstName"] = (JsonElement)JsonSerializer.Deserialize(""" ["firstName"] = JsonElement.Parse("""
"Bob" "Bob"
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
["zipCode"] = (JsonElement)JsonSerializer.Deserialize(""" ["zipCode"] = JsonElement.Parse("""
90210 90210
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
["isAdmin"] = (JsonElement)JsonSerializer.Deserialize(""" ["isAdmin"] = JsonElement.Parse("""
false false
""", McpJsonUtilities.DefaultOptions.GetTypeInfo(typeof(JsonElement)))!, """),
}, },
}; };
}, },