我正在尝试在 .NET 中序列化和反序列化非类型安全的 JSON 数据,但我很难确定处理此类数据的最佳方法。
模型类需要处理所有这些数据类型(来自端点的响应可以是其中之一):
{
"id": "string-id",
"otherParameter": "i-am-string"
}
{
"id": "string-id",
"otherParameter": 4
}
{
"id": "string-id",
"otherParameter": ["i-am-string-array-1", "i-am-string-array-2"]
}
{
"id": "string-id",
"otherParameter": {
"parameter1":"i-am-string",
"parameter2":5,
}
}
我尝试构建一个自定义 JsonConverter,但我对该解决方案并不完全满意,因为它的性能不如类型安全响应。
您可以使用 ServiceStack 的 JavaScript Utils
JSON.parse()
方法轻松解析任何有效的临时 JSON,例如:
var json =
"""
[
{"id": "string-id", "otherParameter":"i-am-string"},
{"id": "string-id", "otherParameter":4},
{"id": "string-id", "otherParameter":["i-am-string-array-1","i-am-string-array-2"]},
{"id": "string-id", "otherParameter":{
"parameter1":"i-am-string",
"parameter2":5
}}
]
""";
if (JSON.parse(json) is List<object> objs)
{
foreach (var item in objs.Cast<Dictionary<string,object>>())
{
var id = item["id"];
Console.WriteLine($"Id: {id}");
if (item.TryGetValue("otherParameter", out var otherParameter))
{
switch (otherParameter)
{
case string str:
Console.WriteLine($"String: {str}");
break;
case int i:
Console.WriteLine($"Int: {i}");
break;
case List<object> list:
Console.WriteLine("List:");
foreach (var listItem in list) {
Console.WriteLine($" {listItem}");
}
break;
case Dictionary<string,object> dict:
Console.WriteLine("Dictionary:");
foreach (var kvp in dict) {
Console.WriteLine($" {kvp.Key}: {kvp.Value}");
}
break;
}
}
}
}