【发布时间】:2014-08-05 10:54:16
【问题描述】:
我有一个如下所示的 JSON 提要(我删除了本示例不需要的一些字段):
{
"total_count": 2,
"num_pages": 1,
"current_page": 1,
"balance": {
"amount": "0.00001199",
"currency": "BTC"
},
"transactions": [
{
"transaction": {
"id": "5018f833f8182b129c00002f",
"created_at": "2012-08-01T02:34:43-07:00",
"sender": {
"id": "5011f33df8182b142400000e",
"name": "User Two",
"email": "user2@example.com"
},
"recipient": {
"id": "5011f33df8182b142400000a",
"name": "User One",
"email": "user1@example.com"
}
}
},
{
"transaction": {
"id": "5018f833f8182b129c00002e",
"created_at": "2012-08-01T02:36:43-07:00",
"hsh": "9d6a7d1112c3db9de5315b421a5153d71413f5f752aff75bf504b77df4e646a3",
"sender": {
"id": "5011f33df8182b142400000e",
"name": "User Two",
"email": "user2@example.com"
},
"recipient_address": "37muSN5ZrukVTvyVh3mT5Zc5ew9L9CBare"
}
}
]
}
此提要中有两种类型的交易:具有recipient 的内部交易,以及具有hsh 和recipient_address 的外部交易。
我创建了以下类来适应这种结构:
因此,我们为所有分页结果 (PagedResult) 提供了一个基类,并为事务 (TransactionPagedResult) 提供了特定实现。这个结果有一个包含 0..* 事务的集合(抽象类Transaction)。它们不是Transaction 类型,而是InternalTransaction 或ExternalTransaction 类型,它们是Transaction 的实现。
我的问题是如何让 JSON.NET 处理这个问题。我希望 JSON.NET 查看它正在解析的当前事务是 InternalTransaction 还是 ExternalTransaction,并将相应的类型添加到 TransactionPagedResult 中的 IEnumerable<Transaction> 集合中。
我创建了自己的 JsonConverter,并使用 [JsonConverter(typeof(TransactionCreationConverter))] 属性将其作为属性添加到 IEnumerable<Transaction>,但这不起作用,我收到以下错误:
附加信息:从 JsonReader 读取 JObject 时出错。当前的 JsonReader 项不是对象:StartArray。路径“交易”, 第 1 行,位置 218。
我理解这是因为 JSON.NET 试图反序列化整个集合,但我希望它一个一个地反序列化集合中的每个对象。
有人吗?
【问题讨论】:
-
到目前为止的帖子不错,但是您能否在帖子的最后添加您所说的...“但这不起作用”的确切含义?
-
是的,我没有添加,因为我不希望帖子变得太长。我收到一个错误,指出 JsonReader 项不是对象而是数组(这是正确的,因为我将属性放在 IEnumerable 集合上)。我希望 JsonConverter 查看 IEnumerable 中的每个项目,它们都是对象。
-
@Jack 我认为你链接到了错误的线程?
-
这有帮助吗? stackoverflow.com/questions/7699972/… 编辑:固定链接
标签: c# .net json json.net json-deserialization