【问题标题】:Force Deserialize DateTime in a property of type object在对象类型的属性中强制反序列化 DateTime
【发布时间】:2017-05-31 01:20:48
【问题描述】:

我有一个对象,其属性类型为“对象”(需要这个以获取通用代码)。

Public Property Valeur() As Object

我用 DataContractJsonSerializer 序列化它,我有这个:

            }, {
            "Desc": "Date ouverture",
            "Id": "DatOuverture",
            "Mode": 0,
            "Valeur": "\/Date(1482966000000+0100)\/"
        }, {

所以,当我反序列化它时,序列化程序将“Valeur”转换为字符串,而不是 dateTime。

Valeur = "\/Date(1482966000000+0100)\/"

我尝试使用“AlwaysTransmitTypeInformation”,但没有任何改变。 当我在序列化之前写入属性时,她是“日期时间”类型,而不是字符串。

有关信息,Valeur 可以是与 dateTime 不同的类型。

有人有想法吗?

注意。

【问题讨论】:

  • 似乎序列化无法自动转换动态类型。
  • 时间看起来可能很长:DateTime time = DateTime.FromBinary(1482966000000);
  • 这些只是有问题的日期,其他类型(甚至是复杂对象)也可以。
  • 您好 Jdweng,我的属性也可以是数字或布尔值,...,我需要一个格式日期来识别类型。
  • 这里给出了一个类似问题的解决方案:How to serialize/deserialize a DateTime stored inside an object field using DataContractJsonSerializer?。这符合您的需求吗?

标签: c# json datetime serialization


【解决方案1】:

constructing your serializer object 时,您可以使用DataContractJsonSerializerSettings 指定日期格式:

public class Item
{
    public object Value { get; set; }
}


class Program
{
    static void Main()
    {
        var settings = new DataContractJsonSerializerSettings
        {
            DateTimeFormat = new DateTimeFormat("o"),
        };
        var serializer = new DataContractJsonSerializer(typeof(Item), settings);

        var item = new Item { Value = DateTime.UtcNow };
        serializer.WriteObject(Console.OpenStandardOutput(), item);
    }
}

将序列化为:

{"Value":"2017-01-16T08:50:47.9127678Z"}

作为替代方案,您可以使用Json.NET,它可以让您更好地控制序列化过程。

【讨论】:

  • 你好 Darin,我使用 DataContractJsonSerializer 的另一个构造函数: DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T), null, int.MaxValue, false, dcs, AlwayEmitTypeInformation); ...因此,无法访问 DataContractJsonSerializerSettings 参数。我在实例化之前寻找设置它,就像一个属性集,但我找不到名为“..Setting”的属性。
  • 您使用的是哪个版本的 .NET 框架?此设置可从 .NET 4.5 获得。如果您使用的是旧版本的框架,那么您就不走运了。我建议你切换到 Json.NET。
  • 我正在使用 FrameWork 4.0。另外,我尝试使用 Json.Net,但遇到另一个问题,所有对象都是 JObject 类型也许我没有正确使用它:Dim js As Newtonsoft.Json.Linq.JArray = Newtonsoft.Json.Linq.JArray.Parse(json) Dim ret As T = js.ToObject(Of T)() Return ret
  • 你需要定义一个强类型模型,然后反序列化到这个模型,而不是调用JArray.Parse
  • 我不明白... T 是一个强类型模型。你能给我举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多