处理 .NET 中的非类型安全 JSON 数据

问题描述 投票:0回答:1

我正在尝试在 .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,但我对该解决方案并不完全满意,因为它的性能不如类型安全响应。

c# .net system.text.json
1个回答
0
投票

您可以使用 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;
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.