【发布时间】:2014-10-28 20:49:22
【问题描述】:
我需要像这样反序列化 json(它是在 DICOM 中定义的 - 一个国际标准,所以我不能改变格式!)
{
....
"00080060": {
"Value": [
"US"
],
"vr": "CS"
},
"00080070": {
"Value": [
"ACME Products"
],
"vr": "LO"
},
"00080090": {
"Value": [
{
"AlphabeticName": "Better^Make^U.^MD"
}
],
"vr": "PN"
},
"00081110": {
"Value": [
{
"00080008": {
"Value": [
"XX_0",
"OIU",
null,
"PPP"
],
"vr": "CS"
}
},
{},
{
"00080008": {
"Value": [
"XX_2",
"OIU",
null,
"PPP"
],
"vr": "CS"
}
}
],
"vr": "SQ"
},
每个属性(在一个长列表中!)都有一个名称(在上面的示例中为 0008XXXX),并具有子属性“vr”和 Value。在大多数情况下,Value 只是一个对象数组(字符串或数字),这很好,但对于 2 种特殊情况(如上的 PN 和 SQ),它需要特殊处理,而在 SQ 的情况下,它实际上是一个再次是顶级对象(可以无限递归地嵌套......)
所以 - 我需要一个简单的方法,在反序列化过程中检查“vr”值并为 json.net 提供它应该用于相关“值”的类型 - 有没有简单的方法可以做到这一点?当然,vr 可能出现在 Value 之前或之后(取决于远程实现)这一事实可能会使事情变得更加复杂......
我查看了 json.net 的 ContractResolver 和 JsonConverter 机制,但 ContractResolver 似乎不允许我访问正在读取的数据以允许做出选择,而 JsonConverter 派生类似乎让我不得不重新- 对我来说已经实现了 json.net 的大部分内容(否则太好了!):-(
我是否在这里遗漏了一些明显而简单的解决方案?
【问题讨论】:
-
JObject是您所需要的。不幸的是,我没有足够的时间来使用它进行解析。
标签: c# serialization recursion json.net json-deserialization