DocumentDb DateTime反序列化错误

时间:2015-11-04 18:07:18

标签: c# json datetime serialization azure-cosmosdb

首先,这不是关于对DateTime值进行索引或查询,如blog post所述。

它是关于在使用嵌套复杂对象反序列化文档时从.NET SDK获取错误,其中一个文档具有DateTime属性。

文件的结构如下:

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日编辑: 好的,这仍然困扰着我。

我尝试过像Ryan CrawCour的例子,但由于它是一个托管的哈希分区数据库,我不能那样做。根据托管散列分区dbs上的文档db教程初始化db。

因此,可以执行以下类型的请求:

        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',第1行,第541位。

1 个答案:

答案 0 :(得分:0)

我无法重现这一点。

我复制了你的对象,就像他们在这里一样。然后使用以下代码能够保存文档然后检索它,并将其重新归入帐户类型。

        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