我有一个奇怪的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<Dictionary<int, Dictionary<DateTime, Dictionary<int, PermissionValues>>>>
我想改变JToken为bool。当我添加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: '无法转换字符串。对字典键类型'System.Int32'执行'isAllowed'。创建一个TypeConverter将字符串转换为键类型对象。路径"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属性上使用jsonconverter属性
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);
}
}