使用 JsonConverter 将 JToken 反序列化为 bool

Use JsonConverter to deserialize JToken to bool

我有一个奇怪的 JSON 对象需要反序列化。

{
  "data": {
    "id": 123,
    "permissions": {
      "appName": {
        "data": {
          "1": {
            "2021-08-01": {
              "2020": {
                "isAllowed": {}
              }
            }
          }
        }
      }
    }
  }
}

我已经将大部分内容与包装器和嵌套词典一起使用,但最后一部分没有按预期工作。如果我像这样创建一个 class 它工作正常,但使用它很笨重。

public class DataWrapper<T>
{
   public T Data { get; set;}
}

public class PermissionValues
{
   public JToken IsAllowed { get; set; }
}

DataWrapper<Dictionary<int, Dictionary<DateTime, Dictionary<int, PermissionValues>>>>

我想将 JToken 更改为布尔值。当我这样做并添加一个 JsonConverter

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    return true; //{} is true but JSON.net parses as null, old was: reader.Value != null;
}

我收到一个错误:

Newtonsoft.Json.JsonSerializationException: 'Could not convert string 'isAllowed' to dictionary key type 'System.Int32'. Create a TypeConverter to convert from the string to the key type object. Path 'data.permissions.appName.data.1.2021-08-01.2020.isAllowed'

知道我错过了什么吗?

使用JToken.ToObject()

string json = "{\"data\":{\"id\":123,\"permissions\":{\"appName\":{\"data\":{\"1\":{\"2021-08-01\":{\"2020\":{\"isAllowed\":{}}}}}}}}}";
var jToken= JToken.Parse(json).SelectToken("$.data.permissions.appName");
var result = jToken.ToObject<DataWrapper<Dictionary<int, Dictionary<DateTime, Dictionary<int, PermissionValues>>>>>();

在 IsAllowed 上使用 JsonConvertor 属性 属性。

public class DataWrapper<T>
{
    public T Data { get; set; }
}

public class PermissionValues
{
    [JsonConverter(typeof(BoolConverter))]
    public bool IsAllowed { get; set; }
}


public class BoolConverter : JsonConverter
{
    //Implement other abstract functions

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return reader.Value != null;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(bool);
    }
}