首先,这不是关于对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位。
答案 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());
};
}