ServiceStack使用JsonSerializer序列化JsonObject会产生无效的json日期

本文关键字:无效 json 日期 使用 JsonSerializer 序列化 JsonObject ServiceStack | 更新日期: 2023-09-27 18:28:16

我正在使用ServiceStack JsonObject.Passe服务来反序列化未知类型。

之后,我使用ServiceStack JsonSerializer.SerializeToString将其保留为json。

对象上有一个DateTime属性,当它被重新序列化时,json对于日期是不正确的

这是的示例代码

void Main()
{
    var p = new Person { Name = "full name", Age = new DateTime(2000,1,1) };
    var json = ServiceStack.Text.JsonSerializer.SerializeToString(p);
    Console.WriteLine(json);
    var jo = ServiceStack.Text.JsonObject.Parse(json);
    var json2 = ServiceStack.Text.JsonSerializer.SerializeToString(jo);
    Console.WriteLine(json2);
}
class Person
{
    public string Name {get;set;}
    public DateTime Age {get;set;}
}

和结果(注意日期周围的额外斜线)

{"Name":"full name","Age":"'/Date(946713600000-0000)'/"}
{"Name":"full name","Age":"''/Date(946713600000-0000)''/"}

ServiceStack使用JsonSerializer序列化JsonObject会产生无效的json日期

这是因为JsonObject只是Dictionary<string,string>的包装器,即:

public class JsonObject : Dictionary<string, string> { ... }

因此,当JsonObject被序列化时,日期值被序列化为string值,其中'被适当地转义。

不幸的是,WCF的JSON格式选择使用'/Date(..)'/格式,因为它不太可能自然生成,因为不需要或通常转义正斜杠(即/)。

一种解决方案是只更改所使用的JSON日期格式,即:

JsConfig.DateHandler = DateHandler.ISO8601