将日期作为字符串传递 - 防止json.net解析日期

时间:2016-06-02 08:54:16

标签: c# json json.net asp.net-web-api2 swagger

我有一个Web API中间层,它使用一个API,它暴露一个带有时间戳为字符串的字段(字段是字符串,它包含一个像“2016-05-31T14:12:45.753Z”这样的值)。 / p>

中间层中的代理类是使用Swagger端点的Visual Studio生成的,并且使用Json.NET对对象进行反序列化。

我可以看到该字段是以字符串形式收到的(这很好):

inputObject {{  "When": "2016-05-31T14:12:45.753Z" }} Newtonsoft.Json.Linq.JToken {Newtonsoft.Json.Linq.JObject}

但是,即使目标字段是字符串,inputObject [“When”]的值也会被解析为时间戳。

    inputObject["When"] {31/05/2016 14:12:45}   Newtonsoft.Json.Linq.JToken {Newtonsoft.Json.Linq.JValue}

然后

            JToken whenValue = inputObject["When"];
            if (whenValue != null && whenValue.Type != JTokenType.Null)
            {
                this.When = ((string)whenValue);
            }

最后this.When是一个值为31/05/2016 14:12:45的字符串。

是否有一个选项可以阻止json.net解析日期然后再将其转换为字符串?

请记住,这种转换发生在自动生成的代码中,所以我正在寻找一些方法来装饰服务器端的字段,这将使Swagger以某种方式标记它,然后生成的类将避免反序列化/序列化问题。

类似的东西:

          [JsonProperty("This really is a string, leave it alone")]
          public string When { get; private set; }

2 个答案:

答案 0 :(得分:0)

(回答我自己的问题)

我需要一个快速的解决方案,这是我的临时解决方案,用于记录。

我将日期格式化为

"When": "2016-05-31 14:12:45"

而不是

"When": "2016-05-31T14:12:45.753Z"

这可以防止它被解释。前端(javascript)代码知道来自API的时间戳是UTC,并且它附加了' Z'在将时间戳转换为本地时间和格式化显示之前,例如:

 <td>{{vm.prettyDateTimeFormat(item.StatusDate+'Z')}}</td>

ctrl代码:

  vm.prettyDateTimeFormat = function (dateString)
    {
        var momentDate = moment(dateString, "YYYY-MM-DD HH:mm:ssZZ");
        if (typeof(momentDate) === "undefined" || (!momentDate.isValid()))
        {
            return dateString;
        }

        //The format needs to be sortable as it ends up in the grid.
        var nicePrettyDate = momentDate.format('YYYY-MM-DD HH:mm:ss');
        return nicePrettyDate;
    }

就我不喜欢这个解决方案而言,它带我们完成了演示。这个问题显然在后面的日志中,现在要正确处理。

答案 1 :(得分:-1)

 [JsonIgnore]
 public string When { get; private set; }