我有一个 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
类型,而是属于Transaction
的实现类 InternalTransaction
或 ExternalTransaction
。我的问题是如何让 JSON.NET 处理此问题。我希望 JSON.NET 能够判断当前要解析的交易是 InternalTransaction
还是 ExternalTransaction
,并将相应类型添加到 TransactionPagedResult
中的 IEnumerable<Transaction>
集合中。我已经创建了自己的 JsonConverter,并将其作为属性添加到 IEnumerable<Transaction>
中,并使用 [JsonConverter(typeof(TransactionCreationConverter))]
特性进行标注,但是这没有起作用,我得到了以下错误消息:“Error reading JObject from JsonReader. Current JsonReader item is not an object: StartArray. Path 'transactions', line 1, position 218.” 我理解这是因为 JSON.NET 尝试反序列化整个集合,但我希望它逐个反序列化集合中的每个对象。请问如何实现?