Json.NET ToObject日期序列化格式

时间:2016-11-20 21:28:59

标签: c# .net json.net

我在尝试设置自定义日期格式时使用Newtonsoft.Json ToObject将JSON转换为我的自定义对象,但尝试了不同的方法我根本无法改变日期格式。< / p>

public class CustomObject
        {
            public string DateRecordedString { get; set; }
        }

static void Main(string[] args)
        {
            string jsonResult = "[{\"daterecordedstring\":\"2016-11-21T08:24:42\"}]";
            JToken jtokenResult = JToken.Parse(jsonResult);

            var objectResult1 = jtokenResult.ToObject<CustomObject[]>();
            Console.WriteLine(objectResult1.First().DateRecordedString); // -> 11/21/2016 08:24:42

            var objectResult2 = jtokenResult.ToObject<CustomObject[]>(new JsonSerializer { DateParseHandling = DateParseHandling.None });
            Console.WriteLine(objectResult2.First().DateRecordedString); // -> 11/21/2016 08:24:42

            var objectResult3 = jtokenResult.ToObject<CustomObject[]>(new JsonSerializer { DateFormatString = "yyyy-M-d" });
            Console.WriteLine(objectResult3.First().DateRecordedString); // -> 11/21/2016 08:24:42

        }

如何让ToObject以我想要的格式返回日期(或保持不变)?

2 个答案:

答案 0 :(得分:1)

似乎JToken.Parse之前正在进行某种类型转换。

正如Do not convert JToken date time string as DateTime

所述
void Main()
{
     string jsonResult = "[{\"daterecordedstring\":\"2016-11-21T08:24:42\"}]";

    using (var sr = new StringReader(jsonResult))
    using (var jr = new JsonTextReader(sr) { DateParseHandling = DateParseHandling.None })
    {
        var j = JToken.ReadFrom(jr);
        Console.WriteLine(j["value"].ToString()); // prints '2016-11-21T08:24:42'
    }
}

对user5090812的全部赞誉

答案 1 :(得分:0)

JToken的 ToObject 不尊重 DateParseHandling = DateParseHandling.None

代码如下: item => JToken 类型

Dictionary<string, string> data = item.ToObject<Dictionary<string, string>>(new JsonSerializer { DateParseHandling=DateParseHandling.None});

没有工作,它仍然可以转换为MM / dd / yyyy。

在我的情况下,我从反序列化字符串中获取JArray,请记住,JArray中的每个项目都是JToken。

要使其工作,请在生成JToken之前不添加任何格式指令。

因此,在反序列化级别上添加 DateParseHandling = DateParseHandling.None ,然后再生成JArray。

Newtonsoft.Json.Linq.JArray arr = JsonConvert.DeserializeObject(data, new JsonSerializerSettings {  DateParseHandling=DateParseHandling.None}) as Newtonsoft.Json.Linq.JArray;

现在,如果您为每个JToken遍历此JArray并使用JToken.ToObject,则不会得到格式化的日期时间。