2012-07-24 17 views
1

所以,我有一些JSON我正在反序列化。请记住,我无法控制我收到的数据;我只需要尽我所能地使用它。使用JSON.NET进行反序列化 - 如何处理两种可能类型的名称?

有人会相当好,直到我在那里的项目(以下"z")可以是两种不同类型的(见"z":[]"z":{})相同的项目类型中遇到了一个问题(在我处理的数据,在反序列化之后things应被视为Dictionary<string, FooType> ...)。

{ 
"things":{ 
    "1":{ 
     "x":123.45, 
     "y":678.90, 
     "z":{ 
       "2":true 
      }, 
     "a":[ 
       1, 
       2 
      ] 
     }, 
    "2":{ 
     "x":1414.23, 
     "y":5656.78, 
     "z":[ 
       true 
      ], 
     "a":[ 
       3 
      ] 
     } 
    } 
} 

我敢肯定这是一个错误输出(即源生产"z":[true]时候就应该产生"z":{"0":true}),因为这是怎么"z":[true]要在应用程序后解释。但是,正如我所说的,我无法控制数据,这个问题不太可能在短时间内得到解决。我试过每个成员变量,但命名冲突(从使用[DataContract(Name =“z”)]])会导致异常(不出所料)。

如何将两种类型的"z"读取到常见的FooType中? (或者等价的,比如常见的FooParentType的两个子类只能在正确的情况下得到应用...)

编辑:我宁愿达到期望的结果作为反序列化过程的一部分,没有preprcossing字符串(不过,如果没有其他的方式,我会去那里,我猜...)

我使用C#,单声道,JSON.NET,并使用代码如下所示(compilable version on pastebin):

string jsonString = "{\"things\":{\"1\":{\"x\":123.45,\"y\":678.9,\"z\":{\"2\":true},\"a\":[1,2]},\"2\":{\"x\":1414.23,\"y\":5656.78,\"z\":[true],\"a\":[3]}}}"; 
RootType rt = JsonConvert.DeserializeObject<RootType>(jsonString); 

带班:

[DataContract] 
class RootType 
{ 
    [DataMember(IsRequired = true)] 
    public Dictionary<string, FooType> things { get; set; } 
} 

[DataContract] 
class FooType 
{ 
    [DataMember(IsRequired = true)] 
    public double x { get; set; } 

    [DataMember(IsRequired = true)] 
    public double y { get; set; } 

    [DataMember(IsRequired = true)] 
    public List<int> a { get; set; } 

    // List<bool> zList and Dictionary<string, bool> zDict each only work for one case 
    // but not the other, and having both causes a naming conflict 
} 

回答

1

我有一个类似的问题,只是通过string.replace函数来运行字符串,以在反序列化之前“纠正”数据。

+0

那么,这确实是一个解决方案。如果可能的话,我想避免预处理字符串。 – 2012-07-24 11:51:37

+0

接受,因为我最终不得不这样做。 – 2012-11-02 01:43:40