BSON对象被部分反序列化

时间:2014-10-24 15:38:39

标签: json deserialization bson

我正在尝试将来自Web API调用的BSON HTTP响应消息反序列化为自定义类型。

 using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:1234");

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/bson"));
            HttpResponseMessage result;

            result = await client.GetAsync("/endpoint/");

            MediaTypeFormatter[] formatters = new MediaTypeFormatter[] {
                new BsonMediaTypeFormatter()
            };

            if (result.IsSuccessStatusCode)
            {
                try
                {
                    RootObject res = await result.Content.ReadAsAsync<RootObject>(formatters);
                }
                catch (Exception e)
                {

                }
            }

我知道Web API正在返回BSON,我通过Fiddler进行了检查,上面的代码确实在RootObject中正确地反序列化了大多数事情。似乎所有派生类都没有被反序列化,只是作为null输入到对象中。以下是未反序列化的派生类的示例。

RootObject.Events.Teams.Linescores

RootObject

[DataContract(Namespace = "", Name = "RootObject")]
[Serializable] 
public class  RootObject: infoBase
{
    [DataMember(EmitDefaultValue = false, Order = 30)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore, Order = 30)]
    public IEnumerable<eventInfo> events { get; set; }

    public RootObject() { }
}

活动对象

[DataContract(Namespace = "", Name = "event")]
[Serializable]
[KnownType(typeof(subEventTeam))]
public class eventInfo : infoBase
{
    [DataMember(EmitDefaultValue = false, Order = 170)]
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore, Order = 170)]
    public List<eventTeamBase> teams { get; set; }

    public eventInfo() { }
}

团队基础和特定团队类型

[DataContract(Namespace = "", Name = "team")]
[Serializable]
[KnownType(typeof(bbLinescoreInfo))]
public class eventTeamBase : infoBase {

     [DataMember(Order = 20)]
     [JsonProperty(Order = 20)]
     public string location { get; set; }

     [DataMember(Order = 30, EmitDefaultValue = false)]
     [JsonProperty(Order = 30, NullValueHandling = NullValueHandling.Ignore)]
     public string nickname { get; set; }

     [DataMember(EmitDefaultValue = false, Name = "linescores", Order = 130)]
     [JsonProperty(NullValueHandling = NullValueHandling.Ignore, Order = 130)]
     public IEnumerable<linescoreBase> linescores { get; set; }

  public eventTeamBase() { }
}

[DataContract(Namespace = "", Name = "team")]
[Serializable]
public class  subEventTeam : eventTeamBase
{
   public subEventTeam () { }
}

Linescore Base和Specific Object

[DataContract(Name = "linescores", Namespace = "")]
[Serializable]
[KnownType(typeof(subLinescoreInfo))]
public class linescoreBase : infoBase
{
    public bool isProcessing = false;
    public int teamId { get; set; }

    public linescoreBase() { }
}
[DataContract(Name = "linescores", Namespace = "")]
[Serializable] public class  subLinescoreInfo : linescoreBase
{
    [DataMember]
    public int inning { get; set; }
    [DataMember]
    public int? score { get; set; }

    public subLinescoreInfo() { };
}

这是响应的反序列化(然后重新序列化)部分,它不能将输出输出到JSON中。

{
"status":"OK",
"recordCount":1,
"RootObject":[
{
  "events":[
  {
      "teams":[
      {
         "location":"Tallahassee",
         "nickname":"Razors",
         "linescores":[
            {},{},{},{},{},{},{},{}]
       }
   }
 }

}

正如您所看到的,它正确地填充了一些信息(还有更多信息,为了说明问题,我已经大大减少了)。但是线条正在返回null。如上所述,数据正确返回且不为空。

我觉得我对已知的类型做错了,我尝试过将它们放在不同的地方的多种组合,结果不会改变。任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

经过大量搜索和尝试错误的东西,我在另一个线程中找到了类似的解决方案。 JSON Solution

我通过做同样的事情来解决这个问题,但使用BSON而不是JSON。

这是我需要在Web API的全局配置文件中添加的代码

BsonMediaTypeFormatter bsonFormatter = new BsonMediaTypeFormatter();
bsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects;
bsonFormatter.AddQueryStringMapping("accept", "bson", "application/bson");
GlobalConfiguration.Configuration.Formatters.Add(bsonFormatter);

这段代码进入了客户端。

BsonMediaTypeFormatter bsonFormatter = new BsonMediaTypeFormatter();
bsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects;
MediaTypeFormatter[] formatters = new MediaTypeFormatter[] {
   bsonFormatter
};

其他所有内容都保持不变,并且无故障地反序列化。