【发布时间】:2021-04-09 06:16:17
【问题描述】:
我已经彻底浏览了其他问题,但我无法解决这个问题。
JSON 如下
[
{
"$type": "UWP.Model.Management.VirtualCarPark.Item.AggregatorItem, UWP.Model",
"UId": 17,
"Name": "K2 BDB-INCON4-U",
"IsPublished": true,
"Items": [{
"$type": "UWP.Model.Management.VirtualCarPark.Item.Item, UWP.Model",
"IsPublished": true,
"UId": 18,
"OwnerUId": 17,
"Name": "1: Root - I/O Modules K2 Switch 1",
"UIdStreet": 1,
"UIdArea": 1
},
{
"$type": "UWP.Model.Management.VirtualCarPark.Item.Item, UWP.Model",
"IsPublished": true,
"UId": 19,
"OwnerUId": 17,
"Name": "2: Root - I/O Modules K2 Switch 2",
"UIdStreet": 1,
"UIdArea": 1
}
]
},
{
"$type": "UWP.Model.Management.VirtualCarPark.Item.AggregatorItem, UWP.Model",
"UId": 41,
"Name": "K3 SH2INDI424",
"IsPublished": true,
"Items": [{
"$type": "UWP.Model.Management.VirtualCarPark.Item.Item, UWP.Model",
"IsPublished": true,
"UId": 42,
"OwnerUId": 41,
"Name": "1: Root - Switches K3 Switch 1",
"UIdStreet": 1,
"UIdArea": 1
},
{
"$type": "UWP.Model.Management.VirtualCarPark.Item.Item, UWP.Model",
"IsPublished": true,
"UId": 43,
"OwnerUId": 41,
"Name": "2: Root - Switches K3 Switch 2",
"UIdStreet": 1,
"UIdArea": 1
},
{
"$type": "UWP.Model.Management.VirtualCarPark.Item.Item, UWP.Model",
"IsPublished": true,
"UId": 44,
"OwnerUId": 41,
"Name": "3: Root - Switches K3 Switch 3",
"UIdStreet": 1,
"UIdArea": 1
},
{
"$type": "UWP.Model.Management.VirtualCarPark.Item.Item, UWP.Model",
"IsPublished": true,
"UId": 45,
"OwnerUId": 41,
"Name": "4: Root - Switches K3 Switch 4",
"UIdStreet": 1,
"UIdArea": 1
}
]
}
]
如您所见,我输入了类型,谢谢
TypeNameHandling = TypeNameHandling.Auto
所以,我不明白为什么我不能反序列化如下
var lstAggregatorItem = JsonConvert.DeserializeObject<List<AggregatorItem>>(tokenAggregators.ToString());
AggregatorItem 类只有接口,没有 Item 的实现,因为我只想使用接口而不是直接实现
public class AggregatorItem : IAggregatorItem
{
public int UId { get; set; }
public string Name { get; set; }
public bool IsPublished
{
get { return Items.Any(i => i.IsPublished); }
}
public AggregatorItem()
{
Items = new List<IItem>();
}
public IList<IItem> Items { get; set; }
public IItem GetItem(int itemUId)
{
return Items.SingleOrDefault(i => i.UId == itemUId);
}
public void Remove(int itemUId)
{
var itemToRemove = Items.SingleOrDefault(i => i.UId == itemUId);
if (itemToRemove == null)
return;
itemToRemove.Reset();
Items.Remove(itemToRemove);
}
public void AddItem(IItem item)
{
Items.Add(item);
}
public void Reset()
{
foreach (var item in Items)
{
item.Reset();
}
Items.Clear();
}
}
那么,有什么东西可以教给序列化程序“使用这个类的这个实现”吗?因为这个异常让我很烦
Newtonsoft.Json.JsonSerializationException: '无法创建 UWP.Model.Management.VirtualCarPark.Item.IItem 类型的实例。类型是接口或抽象类,不能实例化。路径“[0].Items[0].IsPublished”,第 10 行,位置 22。
【问题讨论】:
-
Newtonsoft API 不知道在反序列化此属性
public IList<IItem> Items { get; set; }时使用哪个类,因为您使用的是名为IItem的接口而不是实际类。 Rehaan 的答案中的相关代码是public List<Item> Items { get; set; }。注意您的代码的不同之处(您使用了IItem和 RehaanItem)