2015-11-04 74 views
1

首先,这是不是索引或查询的日期时间值,如blog post盖。DocumentDb日期时间反序列化错误

这是关于反序列化嵌套复杂的对象,其中一人有一个DateTime属性文档时,从.NET SDK得到一个错误。

文档的结构是这样的:

class AccountBase : Document 
{ 
    ... // omitted for brevity 
} 

class Account : AccountBase 
{ 
    [JsonProperty(PropertyName = "calendar")] 
    public Calendar Calendar { get; set; } 
} 

class Calendar 
{ 
    [JsonProperty(PropertyName = "entries")] 
    public List<Entry> Entries{ get; set; } 
} 

class Entry 
{ 
    [JsonProperty(PropertyName = "entryDate")] 
    public DateEpoch EntryDate { get; set; } 
} 

class DateEpoch 
{ 
    [JsonProperty(PropertyName = "date")] 
    public DateTime Date { get; set; } 

    [JsonProperty(PropertyName = "epoch")] 
    public int Epoch 
    { 
     get 
     { 
      return (this.Date.Equals(null) || this.Date.Equals(DateTime.MinValue)) 
        ? int.MinValue 
        : this.Date.ToEpoch(); 
     } 
    } 
} 

扩展:

public static int ToEpoch(this DateTime date) 
{ 
    if (date == null) return int.MinValue; 
    DateTime epoch = new DateTime(1970, 1, 1); 
    TimeSpan epochTimeSpan = date - epoch; 
    return (int)epochTimeSpan.TotalSeconds; 
} 

,并试图从Azure中的JsonReaderException得到这个文档时抛出:

读取错误日期。意外的令牌:StartObject。路径“calendar.entries [0] .entryDate”,1号线,868

我一直用这个DateEpoch对象多前地方没有问题,什么那么位置。 我第一次以为this可能是相关的,但现在我没有真正的线索。

是否有任何人认识到这个问题?

编辑:请求

的数据,和它看起来像这样在Azure中浏览:

"calendar": { 
... // omitted for brevity 
    "entries": [ 
     { 
     ... // omitted for brevity 

     "entryDate": { 
      "date": "2015-11-03T01:32:30.0600636Z", 
      "epoch": 1446514350 
     } 
     } 
    ] 
} 

11月25日编辑: 好吧,这仍是困扰我。

我想这样做像瑞安CrawCour的例子,但因为它是一个管理哈希分区分贝,我不能那样做。数据库根据托管哈希分区数据块上的文档数据库教程进行初始化。

所以,以下类型的请求,可以做到:

 public void DeserializeAccount() 
     { 
      using (_client) 
      { 
       var state = new AccountState(Guid.NewGuid()); 
       var account = new Account(state) 
       { 
        Calendar = new Calendar 
        { 
         Entries = new List<Entry> 
         { 
          new Entry(Guid.NewGuid(), DateTime.UtcNow) 
         } 
        } 
       }; 

       var doc = _client.CreateDocumentAsync(_database.SelfLink, account).Result; 

       foreach (Account acc in _client.CreateDocumentQuery<Account>(_database.SelfLink) 
            .Where(d => d.Id == doc.Resource.Id) 
            .AsEnumerable()) 
       { 
        System.Diagnostics.Debug.WriteLine(acc.ToString()); 
       }; 
      } 
     } 

仍然得到同样的错误信息:

读取错误的日期。意外的令牌:StartObject。路径 'calendar.entries [0] .entryDate',line 1,position 541.

+1

邮政*数据*导致问题。很可能数据的形状与你的对象不一样,'epoch'与它无关('Unexpected token:StartObject') –

+1

你的JSON是什么样的?它会出现JSON与您的数据模型不匹配,看起来像'{“date”:{...}}'。 – dbc

+0

我更新了JSON。尽管在试图检索它之前几秒钟它就被输入了相同的模型,所以我的代码中没有任何东西会改变,这会阻碍序列化。 –

回答

0

我无法重现这一点。

我复制你的对象,因为他们是在这里。然后使用下面的代码可以保存一个文档,然后检索它,并让它重新回到Account类型。

 using (var client = new DocumentClient(new Uri(endpoint), authKey)) 
     { 
      var collLink = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId); 
      var account = new Account { Calendar = new Calendar{ Entries = new List<Entry> { new Entry { EntryDate = new DateEpoch { Date = DateTime.UtcNow } } }} }; 

      var doc = client.CreateDocumentAsync(collLink, account).Result; 

      foreach (Account acc in client.CreateDocumentQuery<Account>(collLink) 
           .Where(d => d.Id == doc.Resource.Id) 
           .AsEnumerable()) 
      { 
       System.Diagnostics.Debug.WriteLine(acc.ToString()); 
      }; 
     } 

按照这个screengrab。 enter image description here

+0

感谢瑞恩,我自己无法重现,所以我实际上不知道这里发生了什么。 –

+0

好的,所以比这更多一点。首先,我使用托管哈希分区数据块。所以我不能做以上的操作。查看原文,了解更多详情。 –