JObject/JArray处理日期时间字符串的问题
以WebApi为例,我们在使用JObject/JArray作为Controller入参时,会把接收到的Json字符串转换为JObject/JArray对象,这个转换在处理日期时间字符时会转换为DateTime进行处理,会使用操作系统日期格式进行转换。比如如下Json字符串
{"firstName": "John","lastName" : "doe","createTime" : "2023-04-07 07:12:02"
}

转换为JObject以后输出:

我们可以看到createTime值已经从
2023-04-07 07:12:02
变为了
2023-04-07T07:12:02
可以看到JObject/JArray处理Json字符串时并不是把日期时间字符串值当做string来处理的,而是转换为了DateTime类型进行处理,这就导致了输入和输出格式不一致的问题。
在使用时需要注意,如果需要还原为原格式,还需要进行格式化处理:
var createTimeStr = input.SelectToken("createTime")?.Value().ToString("yyyy-MM-dd HH:mm:ss");
或者在将Json字符串转换为JObject/JArray时,使用Load方法不对日期时间字符串进行处理:
/// /// Json字符串转换为JObject(日期时间字符串不进行DateTime类型转换)/// /// json字符串/// public static JObject ParseToJObject(string jsonString){using (var reader = new JsonTextReader(new StringReader(jsonString))){reader.DateParseHandling = DateParseHandling.None;var jObj = JObject.Load(reader);return jObj;}}/// /// Json字符串转换为JArray(日期时间字符串不进行DateTime类型转换)/// /// json字符串/// public static JArray ParseToJArray(string jsonString){using (var reader = new JsonTextReader(new StringReader(jsonString))){reader.DateParseHandling = DateParseHandling.None;var jArray = JArray.Load(reader);return jArray;}}
-----我是华丽的分割线-----------------------------------------------------------
这里补充一个SelectToken的使用注意事项:
SelectToken只有在选择的属性在json中不存在时才会为null,其他情况值是不为null的。
比如,有以下一个jsonStr:
{
"firstName": "John",
"lastName" : null,
"age" : 26,
"joinTime" : "2023-04-25 10:01:03",
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
}
}
var jsonStr = "{\r\n \"firstName\": \"John\",\r\n \"lastName\" : null,\r\n \"age\" : 26,\r\n \"address\" : {\r\n \"streetAddress\": \"naist street\",\r\n \"city\" : \"Nara\",\r\n \"postalCode\" : \"630-0192\"\r\n }\r\n}";
var jObj = JObject.Parse(jsonStr);
Console.WriteLine(jObj.SelectToken("lastName") == null);//false
Console.WriteLine(jObj.SelectToken("nickName") == null);//true
nickName属性不存在,所以此时SelectToken才为null,如果所选属性存在值必然不为null,与所选属性的值无关。
使用SelectToken处理属性值可能为空的字段时可以使用可空类型。
如:
string a = ((DateTime?)item.SelectToken("joinTime"))?.ToString("yyyy-MM-dd");
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
