【问题标题】:Use JsonConverter to deserialize JToken to bool使用 JsonConverter 将 JToken 反序列化为 bool
【发布时间】:2021-09-30 04:15:18
【问题描述】:

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

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

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

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

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

DataWrapper&lt;Dictionary&lt;int, Dictionary&lt;DateTime, Dictionary&lt;int, PermissionValues&gt;&gt;&gt;&gt;

我想将 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: '无法转换字符串 'isAllowed' 到字典键类型'System.Int32'。创建一个 TypeConverter 从字符串转换为键类型对象。小路 'data.permissions.appName.data.1.2021-08-01.2020.isAllowed'

知道我错过了什么吗?

【问题讨论】:

  • isAllowed 在实际的 json 中有哪些值?
  • 您是只对isAllowed 值感兴趣还是需要所有字段?
  • 如果以{}存在则为true,否则为false
  • 是的,我需要整个对象。还有很多,这只是一个简化的sn-p
  • 空括号{}是真的吗?没有价值..不应该是假的吗?如果你能在你的帖子中给出真假的例子会更好..因为评论不完全清楚

标签: c# .net json.net


【解决方案1】:

使用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);
    }
}

【讨论】:

  • 谢谢。我尝试使用 jToken.ToObject&lt;&gt; 而不是 JsonConvert.DeserializeObject&lt;&gt; 但同样的错误。
  • @Supergibbs dotnetfiddle.net/aRhM28.. 它对我有用.. 检查小提琴,让我知道在解释方面是否有任何问题。
  • 也适用于我,似乎我的代码中发生了其他事情来混淆它。感谢您的帮助
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2016-05-18
相关资源
最近更新 更多