Azure cosmosdb 对文档反序列化禁用DateParseHandling

Azure cosmosdb 对文档反序列化禁用DateParseHandling,azure-cosmosdb,Azure Cosmosdb,我们在DocumentDB上有存储日期的文档。这些日期存储为字符串: { "CreatedOn": "2016-04-15T14:54:40Z", "Title": "Some title", "id": "xxx-xxx-xxxx-xxx-xxx-xxx" } 我们在使用ASP.NET核心的WebAPI上使用最新版本(1.7.0) 映射文档的C#类具有字符串形式的“CreatedOn”属性 问题是,当我们读取一个文档,SDK将其反序列化时,它会尝试将其转换为DateTime,然后

我们在DocumentDB上有存储日期的文档。这些日期存储为字符串:

{
  "CreatedOn": "2016-04-15T14:54:40Z",
  "Title": "Some title",
  "id": "xxx-xxx-xxxx-xxx-xxx-xxx"
}
我们在使用ASP.NET核心的WebAPI上使用最新版本(1.7.0)

映射文档的C#类具有字符串形式的“CreatedOn”属性

问题是,当我们读取一个文档,SDK将其反序列化时,它会尝试将其转换为DateTime,然后将返回转换为字符串。导致:

{
  "CreatedOn": "15/04/2016 14:54:40",
  "Title": "Some title",
  "id": "xxx-xxx-xxxx-xxx-xxx-xxx"
}
我需要的是修改SDK,使值保持不变。我尝试设置默认SerializerSettings以避免日期解析:

services.AddMvc().AddJsonOptions(opts =>
{
    opts.SerializerSettings.DateParseHandling = Newtonsoft.Json.DateParseHandling.None;
});
但它不起作用

我尝试使用一个属性,但问题是在ReadJson覆盖方法上,读取器已经将字符串值解析为DateTime

class StringJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(value.ToString());
    }

    public override bool CanRead
    {
        get { return true; }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        reader.Value <-- already a parsed DateTime
    }
}
类StringJsonConverter:JsonConverter
{
公共覆盖布尔CanConvert(类型objectType)
{
返回true;
}
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
WriteValue(value.ToString());
}
公共覆盖布尔可读取
{
获取{return true;}
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{

reader.Value最终找到了一个解决方法,因为此时,我正在使用JsonConverter:

public class StringJsonConverter : JsonConverter
   {
       public override bool CanConvert(Type objectType)
       {
           return true;
       }

       public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
       {
           writer.WriteValue(value.ToString());
       }

       public override bool CanRead
       {
           get { return true; }
       }

       public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
       {
           if (reader.ValueType.Equals(typeof(DateTime)))
           {
               return ((DateTime)reader.Value).ToIso8601Date();
           }
           if (reader.ValueType.Equals(typeof(DateTimeOffset)))
           {
               return ((DateTimeOffset)reader.Value).DateTime.ToIso8601Date();
           }
           return (string)reader.Value;
       }        
   }
通过这个简单的扩展:

public static class DateTimeExtensions
{
    private const string DateTimeFormat = "{0}-{1}-{2}T{3}:{4}:{5}Z";

    public static string ToIso8601Date(this DateTime date)
    {
        if (date.Equals(DateTime.MinValue))
        {
            return null;
        }
        return string.Format(
            DateTimeFormat,
            date.Year,
            PadLeft(date.Month),
            PadLeft(date.Day),
            PadLeft(date.Hour),
            PadLeft(date.Minute),
            PadLeft(date.Second));
    }
     private static string PadLeft(int number)
    {
        if (number < 10)
        {
            return string.Format("0{0}", number);
        }

        return number.ToString(CultureInfo.InvariantCulture);
    }
}
公共静态类DateTimeExtensions
{
private const string DateTimeFormat=“{0}-{1}-{2}T{3}:{4}:{5}Z”;
公共静态字符串ToIso8601Date(此日期时间日期)
{
if(date.Equals(DateTime.MinValue))
{
返回null;
}
返回字符串格式(
日期时间格式,
日期,年份,,
左键(日期月),
左键(日期日期),
左键(日期小时),
左键(日期分钟),
PadLeft(日期第二);
}
专用静态字符串PadLeft(整数)
{
如果(数字<10)
{
返回string.Format(“0{0}”,数字);
}
返回number.ToString(CultureInfo.InvariantCulture);
}
}

JSON序列化程序设置现在可以直接传递给DocumentClient,这允许您提供所需的灵活性。

Matias,这是WebAPI映射问题而不是DocumentDB问题吗?如果您存储为字符串并读取为字符串,则DocumentDB SDK将不会执行任何翻译。您好@Aravind,这是DocumentDBB问题。我显示的结果是当我调用SDK上的方法时。DocumentDB在内部使用Json.Net,问题是他们和Json.Net会自动尝试将类似日期的字符串解析为日期时间,即使映射的类具有字符串属性。Json.Net的设置有这个目标,即停用自动解析逻辑,但设置为g it在全球层面上似乎对DocumentDB内部使用it的方式没有影响。
public static class DateTimeExtensions
{
    private const string DateTimeFormat = "{0}-{1}-{2}T{3}:{4}:{5}Z";

    public static string ToIso8601Date(this DateTime date)
    {
        if (date.Equals(DateTime.MinValue))
        {
            return null;
        }
        return string.Format(
            DateTimeFormat,
            date.Year,
            PadLeft(date.Month),
            PadLeft(date.Day),
            PadLeft(date.Hour),
            PadLeft(date.Minute),
            PadLeft(date.Second));
    }
     private static string PadLeft(int number)
    {
        if (number < 10)
        {
            return string.Format("0{0}", number);
        }

        return number.ToString(CultureInfo.InvariantCulture);
    }
}