C#:当一个字段可以是不同类型时反序列化 JSON

标签 c# json deserialization

我正在与一个 API 通信,该 API 返回包含 true、false 或字符串数​​组的 JSON。我希望反序列化此 JSON 并将 bool 值(如果有的话)存储在数据类型为 bool 的名为 Success 的类字段中,如果有数组,则存储在名为 Result 的自定义数据类型的字段中。

实现这一目标的最佳方式是什么?

一些 JSON:

[
    {"status":"ok","result":true},
    {
        "status":"ok",
        "result":
        [
            {"name":"John Doe","UserIdentifier":"abc","MaxAccounts":"2"}
        ]
    }
]

我的结果类:

class Result
{
    string Name,
    string UserIdentifier,
    string MaxAccounts
}

与 API 通信的类:

class Api
{
    public string Status { get; set; }
    public Result[] Result { get; set; }
    public bool Success { get; set; }
}

最佳答案

使用 JSON.NET,您可以编写自定义 JSON 转换器。例如,您可以拥有以下对象:

public class Root
{
    public string Status { get; set; }
    public Result Result { get; set; }
}

public class Result
{
    public bool? Value { get; set; }
    public Item[] Items { get; set; }
}

public class Item
{
    public string Name { get; set; }
    public string UserIdentifier { get; set; }
    public string MaxAccounts { get; set; }
}

并且您的 JSON 将被反序列化为 Root[]

自定义 JSON 转换器可能如下所示:

public class ResultConverter: JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Result);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Boolean)
        {
            return new Result
            {
                Value = (bool)reader.Value,
            };
        }

        return new Result
        {
            Items = serializer.Deserialize<Item[]>(reader),
        };
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        // If you want to support serializing you could implement this method as well
        throw new NotImplementedException();
    }
}

然后:

class Program
{
    static void Main()
    {
        var json = 
        @"[
            {
                ""status"": ""ok"",
                ""result"": true
            },
            {
                ""status"": ""ok"",
                ""result"": [
                    {
                        ""name"": ""John Doe"",
                        ""UserIdentifier"": ""abc"",
                        ""MaxAccounts"": ""2""
                    }
                ]
            }
        ]";

        var settings = new JsonSerializerSettings();
        settings.Converters.Add(new ResultConverter());
        Root[] root = JsonConvert.DeserializeObject<Root[]>(json, settings);
        // do something with the results here
    }
}

关于C#:当一个字段可以是不同类型时反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17922848/

相关文章:

c# - .Net Core 和 Microsoft.Web.Administration

c# - XML 比较,用于检查窗口应用程序是否相同或不同

php - 无法从 JSON 接收数据 - PHPMyAdmin

c# - 添加 Camelcase 约定包后的反序列化错误

java - 如何删除 Jackson 反序列化中的未知枚举键?

c# - ASP.NET MVC - 如何限制分页元素的数量并在记录较多时使用 '...'(三个点)进行过滤

javascript - 将文件路径字符串解析为json对象

php - 带有 JSON、AJAX 和 PHP 的数据表不显示任何数据

c# - Json.Net 无法反序列化 DateTime.MinValue

c# - 如何在 C# 中重命名 string[] 的 xml 元素?